many to many(関連) ; Rails ; Design

多対多を実現するには中間モデルが必要(当事者モデル2つだけでなく)

フレームワーク思想に則って現れたらしく。

この経緯に付いては(分かっていないことが多いので)省略。

Prepare

$ rails g model Member name:string
$ rails g model Article title:string
$ rails g model ArticlesMember article_id:integer member_id:integer
$ rake db:migrate

app/models/member.rb

class Member
  has_many :articles_members
  has_many :articles, through: :articles_members
end

app/models/article.rb

class Article
  has_many :articles_members
  has_many :articles, through: articles_members
end

app/models/member.rb

class Member
  belongs_to :article
  belongs_to :member
end

db/seeds.rb

Member.create! do |member|
  member.name = 'mat5ukawa'
end

Member.create! do |member|
  member.name = 'awaku5tam'
end
rake db:seed

action on rails c

$ rails c

> member = Member.find(1)
>> #<Member id: 1,
             name: "mat5ukawa",
             created_at: "2014-01-28 13:04:42",
             updated_at: "2014-01-28 13:04:42">

> member.articles
>>  #<ActiveRecord::Associations::CollectionProxy []>

> member.articles.create(title: 'Maybe Im a leo')
>> begin transaction
>> commit transaction
>> => #<Article id: 2,
                title: "Maybe Im a leo",
                created_at: "2014-01-28 13:35:47",
                updated_at: "2014-01-28 13:35:47">

> member.articles.create(title: 'Smoke on the water')
>> begin transaction
>> commit transaction
>> => #<Article id: 3,
                title: "Smoke on the water",
                created_at: "2014-01-28 13:37:41",
                updated_at: "2014-01-28 13:37:41">

> member.articles
>> => #<ActiveRecord::Associations::CollectionProxy
  [#<Article id: 2,
             title: "Maybe Im a leo",
             created_at: "2014-01-28 13:35:47",
             updated_at: "2014-01-28 13:35:47">,
   #<Article id: 3,
             title: "Smoke on the water",
             created_at: "2014-01-28 13:37:41",
             updated_at: "2014-01-28 13:37:41">]>

> article = Article.find(2)
>> #<Article id: 2,
             title: "Maybe Im a leo",
             created_at: "2014-01-28 13:35:47",
             updated_at: "2014-01-28 13:35:47">

> article.members.create(name: 'mat7ukawa')
>> begin transaction
>> commit transaction
>> #<Member id: 3,
            name: "mat7ukawa",
            created_at: "2014-01-28 13:42:13",
            updated_at: "2014-01-28 13:42:13">

> article.members
>> #<ActiveRecord::Associations::CollectionProxy
  [#<Member id: 1,
            name: "mat5ukawa",
            created_at: "2014-01-28 13:31:44",
            updated_at: "2014-01-28 13:31:44">,
   #<Member id: 3,
             name: "mat7ukawa",
             created_at: "2014-01-28 13:42:13",
             updated_at: "2014-01-28 13:42:13">]>

参考元 # ありがとうございます

soraなりの日々 - fc2 - [ruby, rails]今更だが、has_many :through(多対多)をまとめてみよーか