has_and_belongs_to_many vs has_many through

请通过关系解释has_and_belongs_to_many和has_many之间的区别。 何时何地使用哪一个?

据我记得, has_and_belongs_to_many给你一个简单的查询表,引用你的两个模型。

例如,

故事可以属于很多类别。 分类可以有很多故事。

 Categories_Stories Table story_id | category_id 

has_many :through给你第三个模型,可以用来存储不属于任何原始模型的其他各种信息。

例如

人可以订阅许多杂志。 杂志可以有很多用户。

因此,我们可以在中间有一个订阅模型,它给了我们与前面的例子类似的表格,但是具有附加的属性。

 Subscriptions Table person_id | magazine_id | subscription_type | subscription_length | subscription_date 

等等。

http://guides.rubyonrails.org/association_basics.html#choosing-between-has-many-through-and-has-and-belongs-to-many

最简单的经验法则是,如果您需要将关系模型作为一个独立的实体来使用,您应该build立一个has_many:through关系。 如果你不需要对关系模型做任何事情,build立一个has_and_belongs_to_many关系可能会更简单(尽pipe你需要记住在数据库中创build连接表)。 如果您需要validation,callback或join模型的额外属性,则应该使用has_many:through。

我的经验法则是,我可以通过在这里的checkbox列表? 如果是这样,那么这是一个联谊会。 如果我需要checkbox捕获更多的关系,而不是简单的是/否它属于,然后使用has_many:通过。 HABTM就像在simple_form collection_check_boxes中使用_ids方法一样简单。 Has_many:通常涉及accep_nested_attributes_for。

如果您需要validation,callback或join模型的额外属性,则应该使用has_many:through。