20

我很难弄清楚如何将我的一个模型与另一个模型相关联。Rails Model,属于很多

因为它是现在,我有:

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

回答

40

导轨中的多对多关系不使用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

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

+0

这真的很有帮助!一个有用的补充是关于如何在代码中访问这些关系的一些示例(无论是在控制器还是视图中)谢谢 – msanjay 2014-02-14 08:51:04

26

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

+0

这是否意味着我应该从表中取出外键,因为它们之间由连接表? – Edmund 2012-10-01 15:52:41