通过多对多关系创建/保存数据库

时间:2015-01-24 22:02:25

标签: ruby-on-rails many-to-many has-many

我有两个表,item和category,以及一个名为Items_Categories的连接表。我的一个限制是项目有一个类别。

在我的项目模型中,我有这段代码:

class Item < ActiveRecord::Base
  has_many :items_categories
  has_many :categories, through: :items_categories
  has_many :item_orders
  has_many :orders, through: :item_orders

即使类别不是我的Items数据库中的列。

这是我的ItemsCategory模型:

class ItemsCategory < ActiveRecord::Base
  belongs_to :item
  belongs_to :category
end

这是我的分类模型:

class Category < ActiveRecord::Base
  has_many :items_categories
  has_many :items, through: :items_categories  
end

在我的测试中,我遇到了这个问题:

  test 'it is valid' do
    category = Category.create(name: "hot beverages")
    item = category.items.create(title: "fjdkasf", description: "fjakdsf", price: 20901290)

    assert item.valid?
  end

基本上,此测试失败,因为我无法创建项目,直到item.categories不是nill。但是在我在item_categories中创建项目之前,验证不会通过。那么......我该怎么办?基本上我在创建项目时无法通过验证,因为该项目还没有类别。但我想确保每次创建一个项目时,它都有一个关联的项目。那我该怎么办?

1 个答案:

答案 0 :(得分:0)

有时使用has_many :through关系进行验证可能会非常棘手,has_many :through文档中提示您应该在连接模型上定义inverse_of属性:

  

如果您要修改关联(而不是仅仅读取   它),然后在上面设置:inverse_of选项是个好主意   连接模型上的源关联。这允许相关记录   要构建,它将自动创建适当的连接模型   保存时的记录。 (参见&#39;关联加入模型&#39;   以上部分。)

class ItemsCategory < ActiveRecord::Base
  belongs_to :item, inverse_of: :items_categories 
  belongs_to :category, inverse_of: :items_categories
end

说实话,我并非100%确定会解决这个问题,但请试一试并报告。