多对多:Rails中的简单与丰富

时间:2015-04-15 09:06:49

标签: ruby-on-rails ruby-on-rails-4 model many-to-many associations

关于这两种关系,我有一个问题,因为我认为我已经过度思考并且让自己感到困惑。

因此,它们都涉及一个位于您要加入的两个表之间的新表。

一个简单的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

我是否接近正确?我认为我的问题是我不断将表与模型混淆,或者至少对于简单的多对多,因为我一直期望应该有一个模型与表一起使用。

感谢您提出任何指示。

2 个答案:

答案 0 :(得分:3)

你对这两者的概念性理解几乎就在那里。我不想将它们视为简单,而是将它们视为隐式显式

例如,有两个模型,BookAuthor

使用has_and_belongs_to_many,Rails将在两个模型之间隐式创建连接表。即books_authors

您还可以显式创建连接表,例如Authorshipbelongs_to两者。 (BookAuthor将有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

也许你可以解释一下你在这里考虑的权衡?