我是rails的新手,我正在尝试了解rails关联的工作原理。除了上面提到的2之外,我能够理解所有的关联。
在哪里以及为什么确切地使用has_many:through和has_and_belongs_to_many关联?
请提供最简单的方案
答案 0 :(得分:1)
来自文档:
Choosing Between has_many :through and has_and_belongs_to_many
ActiveRecord Association Basics
最简单的经验法则是,如果需要将关系模型作为独立实体使用,则应设置has_many:through关系。如果您不需要对关系模型执行任何操作,则设置has_and_belongs_to_many关系可能更简单(尽管您需要记住在数据库中创建连接表)。
如果您需要在连接模型上进行验证,回调或额外属性,则应使用has_many:through。
答案 1 :(得分:1)
has_and_belongs_to_many
是Rails 1的遗物。没有理由使用它。与has_many :through
which they're getting rid of in master相比,它遵循一个单独的,支持较少且问题较多的代码路径:
has_and_belongs_to_many现在以has_many:through透明地实现。行为应该保持不变,如果不是,那就是一个错误。
使用has_and_belongs_to_many
您可以使用has_many :through
执行的任何操作如果我要发布代码示例,我只会解释has_and_belongs_to_many
的限制。
答案 2 :(得分:0)
我要结帐Railscast。 Ryan Bates真是一位了不起的老师:)
答案 3 :(得分:0)
两者都用于相同的目的,即在rails中创建many_to_many关系。只是他们有不同的语法。假设有两个表Product和Category,如果我们想在这两个表之间创建many_to_many关系,那么我们应该这样做:
<强> has_and_belongs_to_many 强>
在迁移中
def self.up
create_table 'categories_products', :id => false do |t|
t.column :category_id, :integer
t.column :product_id, :integer
end
end
models / product.rb
has_and_belongs_to_many :categories
models / category.rb
has_and_belongs_to_many :products
has_many:通过
模型/ categorization.rb
belongs_to :product
belongs_to :category
模型/ product.rb
has_many :categorizations
has_many :categories, :through => :categorizations
模型/ category.rb
has_many :categorizations
has_many :products, :through => :categorizations
现在开发人员使用has_many:来创建many_to_many关系,因为它不那么复杂且易于使用