在外行人的条件下,has_many:through和has_and_belongs_to_many之间存在差异

时间:2013-11-03 07:54:21

标签: ruby-on-rails-3 associations

我是rails的新手,我正在尝试了解rails关联的工作原理。除了上面提到的2之外,我能够理解所有的关联。

在哪里以及为什么确切地使用has_many:through和has_and_belongs_to_many关联?

请提供最简单的方案

4 个答案:

答案 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关系,因为它不那么复杂且易于使用