Rails模型,属于很多

时间:2010-12-09 04:20:28

标签: ruby-on-rails ruby-on-rails-3 associations model-associations

我很难弄清楚如何将我的一个模型与另一个模型联系起来。

就像现在一样,我有:

class ModelA < ActiveRecord::Base
  has_many :model_b
end

class ModelB < ActiveRecord::Base
  belongs_to :model_a
end

然而...... ModelB不仅需要属于ModelA的一个实例,而且可能属于三个。我知道有一个has_many:through,但我不确定它在这种情况下会如何起作用。 ModelA的每个实例总是会有三个ModelB实例。但如前所述,ModelB不仅可以属于ModelA的一个实例。

2 个答案:

答案 0 :(得分:45)

rails中的多对多关系不使用belongs_to。相反,您想要使用几个选项中的一个。第一个是has_and_belongs_to_many

# app/models/category.rb
class Category < ActiveRecord::Base
  has_and_belongs_to_many :items
end

# app/models/item.rb
class Item < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

您需要在数据库中添加额外的连接表,并进行如下迁移:

class AddCategoriesItems < ActiveRecord::Migration
  def self.up
    create_table :categories_items, :id => false do |t|
      t.integer :category_id
      t.integer :item_id
    end
  end

  def self.down
    drop_table :categories_items
  end
end

您可以看到连接表的名称是其他两个表名称的组合。必须按照上面的字母顺序提及这些表,并且:id => false需要存在,因为我们不希望在此表上使用主键。它将打破轨道协会。

如果您需要存储关系本身的信息,还有另一种更复杂的方法,称为has_many :through。我写了一篇完整的文章,详细介绍了如何使用这两种方法,以及何时使用每种方法:

Basic many-to-many Associations in Rails

我希望这会有所帮助,如果您有任何其他问题,请与我联系!

答案 1 :(得分:28)

这是@Jaime Bellmyer使用的

# app/models/category.rb
class Category < ActiveRecord::Base
  has_and_belongs_to_many :items
end

# app/models/item.rb
class Item < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

我建议使用此

# app/models/category.rb
class Category < ActiveRecord::Base
  has_many :category_items
  has_many :items, :through => :category_items
end

# app/models/item.rb
class Item < ActiveRecord::Base
  has_many :category_items
  has_many :categories, :through => :category_items
end

# app/models/category_items.rb
class CategoryItems < ActiveRecord::Base
  belongs_to :category
  belongs_to :items
end

如果你使用这个,你将有一个连接模型,它可以让你更好地控制处理类别和项目。但是使用@Jaime建议你只有一个连接表,而不是一个不受控制的模型。