有一個老Railscasts插曲通過兩種方式與Rails進行多對多的關聯 - 你應該看它:http://railscasts.com/episodes/47-two-many-to-many。這是舊的,但大多仍然相關。
所以,你有文章,格式和流派。由於每篇文章只有一種格式,因此您不需要has_and_belongs_to_many
關係。條款belongs_to
格式和格式has_many
條款。
文章列表中的每一行都會有一個format_id
字段來表示它屬於哪種格式。
流派和文章之間的關係是多對多的,這有點棘手。在數據庫級別,這需要一個「連接表」。你的連接表將被稱爲類似articles_genres
,並且每行表示一個特定文章所具有的一種流派。所以,它會有一個genre_id
列和一個article_id
列。
在軌道方面,有兩種方法可以做到這一點:
- 給了
articles_genres
表它自己的模式。在這種情況下,您可能還需要爲表格指定一個不同的名稱,以表明它是一個模型,而不僅僅是一個連接表。你可以這樣稱呼它genreizations
或
- 不要給
articles_genres
表它是自己的模型,並讓rails處理它。
我一般比較喜歡第一種方式 - 我覺得控制力更強,而且將來會讓事情更加靈活。但是,要麼會奏效。我鏈接到的railscasts插曲描述了兩種方式。
如果你去的第一種方式,這是你所擁有的車型:
class Article < ActiveRecord::Base
has_many :genreizations
has_many :genres, through: :genreizations
belongs_to :format
end
class Format < ActiveRecord::Base
has_many :articles
end
class Genreization < ActiveRecord::Base
belongs_to :article
belongs_to :genre
end
class Genre < ActiveRecord::Base
has_many :genreizations
has_many :articles, through: :genreizations
end
而在第二個辦法,這就是你有哪些車型:
class Article < ActiveRecord::Base
has_and_belongs_to_many :genres
belongs_to :format
end
class Format < ActiveRecord::Base
has_many :articles
end
class Genre < ActiveRecord::Base
has_and_belongs_to_many :articles
end
三江源所以很多,這正是我正在尋找的!我想我會選擇第一條路線,以減輕Rails的負擔。再次感謝! – 2014-10-11 00:02:53
很高興幫助:) – 2014-10-11 00:03:07
我忘了提,這篇文章也屬於一個用戶。這是否需要成爲Article&User和Format&User之間的多態關聯? – 2014-10-11 00:08:48