27

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

就像现在一样,我有:

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

4

2 回答 2

50

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 中的基本多对多关联

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

于 2010-12-09T04:30:21.857 回答
33

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

于 2010-12-09T07:46:34.923 回答