我很难弄清楚如何将我的一个模型与另一个模型联系起来。
就像现在一样,我有:
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的一个实例。
答案 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建议你只有一个连接表,而不是一个不受控制的模型。