有一个老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