我有两个表,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中创建项目之前,验证不会通过。那么......我该怎么办?基本上我在创建项目时无法通过验证,因为该项目还没有类别。但我想确保每次创建一个项目时,它都有一个关联的项目。那我该怎么办?
答案 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%确定会解决这个问题,但请试一试并报告。