Rails模型,属于很多

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

就像现在一样,我有:

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的一个实例。

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如果你需要存储关系本身的信息。 我写了一篇完整的文章,详细介绍了如何使用这两种方法,以及何时使用每种方法:

Rails中基本的多对多关联

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

这就是@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建议的你只有一个连接表,而不是一个不受控制的模型。