关于这两种关系,我有一个问题,因为我认为我已经过度思考并且让自己感到困惑。
因此,它们都涉及一个位于您要加入的两个表之间的新表。
一个简单的M2M从其他两个表中获取外键(例如,#34; blog_posts_categories" table将获得blog_post_id和category_id外键)。然后对于关联,blog_post和category模型之间会有has_and_belongs_to_many关联,但是连接表没有模型。
对于富M2M,创建了第三个连接表。此表从其他两个表中获取外键,这两个表获取连接表的外键。然后对于rails关联,连接的DOES获得一个模型,并belongs_to
另外两个相应的模型。以及联接表模型的两个模型has_many
我是否接近正确?我认为我的问题是我不断将表与模型混淆,或者至少对于简单的多对多,因为我一直期望应该有一个模型与表一起使用。
感谢您提出任何指示。
答案 0 :(得分:3)
你对这两者的概念性理解几乎就在那里。我不想将它们视为简单与富,而是将它们视为隐式与显式
例如,有两个模型,Book
和Author
。
使用has_and_belongs_to_many
,Rails将在两个模型之间隐式创建连接表。即books_authors
。
您还可以显式创建连接表,例如Authorship
,belongs_to
两者。 (Book
和Author
将有has_many :authorships
。)
在这两种情况下,您的域模型看起来都是一样的:
Book (1)--(n) Authorship (n)--(1) Author
现在,这是opninionated部分。我更喜欢使用显式方法,因为这在概念上更容易掌握,并且可以更容易地向连接表添加其他字段。例如,您希望订购Authorship
,您可以轻松地将order
列添加到Authorship
模型并相应地使用它。
答案 1 :(得分:1)
第三个关系表适用于多对多关系。你可以这样做:
class BlogPost < ActiveRecord::Base
has_many :blog_post_categories
has_many :categories, through: :blog_post_categories
end
class Category < ActiveRecord::Base
has_many :blog_post_categories
has_many :blog_posts, through: :blog_post_categories
end
class BlogPostCategory < ActiveRecord::Base
belongs_to :blog_post
belongs_to :category
end
第三种模型非常简单,其开销基本上可以忽略不计。如果您想要为该关系附加更多信息(例如,优先级或时间戳),它也是灵活且广泛的。我个人更喜欢为关系设置一个独立的表,而不是blog_posts
表中的几个列。
以下是相关博文:Why You Don’t Need Has_and_belongs_to_many Relationships。
也许你可以解释一下你在这里考虑的权衡?