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