soraなりの日々 - fc2 -

こころにひっかかったもの

[ruby, rails]今更だが、has_many :through(多対多)をまとめてみよーか

今更ですが、railshas_many :through を使った
データの多対多関係の扱いをまとめてみようかと。

(※ もう少し早く、もうちょっと理解してれば
   今もう少し楽できたなという後悔を含め。)

このエントリーをはてなブックマークに追加
さて、今回使うのは単純なクラブと学生の紐付け。
クラブには複数人の学生が紐付けれるし、
学生にも複数のクラブを紐付けれる。
そんな関係。

で、"クラブ"テーブルと"学生"テーブルを作成する。
そんで、データはこんな感じで入れておく。

[クラブ]
clubs01

[学生]
students01

もう一つ、紐づけるためのテーブルが必要になる。
"クラブ"テーブルと"学生"テーブルの紐付けを行うんで、
"club_students" という名前でもして作成する。

"club_students" には、"クラブ"テーブルの id と
"学生"テーブルの id をそれぞれ持たせる。

こんな感じ↓
club_student01

で、これを railshas_many :through を使用して
紐付けをやってみる。

各モデルに has_many :through の設定を行っていく

[models/club.rb]
class Club < ActiveRecord::Base
  has_many :club_students, :dependent => :destroy
  has_many :students, :through => :club_students
end


[models/student.rb]
class Student < ActiveRecord::Base
  has_many :club_students, :dependent => :destroy
  has_many :clubs, :through => :club_students
end


[models/club_student.rb]
class ClubStudent < ActiveRecord::Base
  belongs_to :club
  belongs_to :student
end


で、設定した後に railroad でモデルを吐き出すと
こんな感じになる↓
meibo_model


で、実際に紐付けを行ってみる。
script/console を立ち上げて、、、


[クラブ側から学生を紐付け]
>> c = Club.find(1)
=> #<Club id: 1, name: "テニス", created_at: "2008-10-09 01:51:28", updated_at: "2008-10-09 01:51:28">
>> c.students
=> []
>> c.students << Student.find(2)    # ここで関連づける
=> [#<Student id: 2, name: "テスト次郎", age: 10, created_at: "2008-10-09 01:50:44", updated_at: "2008-10-09 01:50:44">]
>> c.students
=> [#<Student id: 2, name: "テスト次郎", age: 10, created_at: "2008-10-09 01:50:44", updated_at: "2008-10-09 01:50:44">]


[学生側からクラブを紐付け]
>> s = Student.find(3)
=> #<Student id: 3, name: "テスト三郎", age: 8, created_at: "2008-10-09 01:50:58", updated_at: "2008-10-09 01:50:58">
>> s.clubs
=> []
>> s.clubs << Club.find(1)    # ここで関連づける
=> [#<Club id: 1, name: "テニス", created_at: "2008-10-09 01:51:28", updated_at: "2008-10-09 01:51:28">]
>> s.clubs
=> [#<Club id: 1, name: "テニス", created_at: "2008-10-09 01:51:28", updated_at: "2008-10-09 01:51:28">]


で、追加されました。

club_student03


いじょっす。
このエントリーをはてなブックマークに追加

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://sora2hs.blog70.fc2.com/tb.php/394-0c8ab51d
この記事にトラックバックする(FC2ブログユーザー)