我有一个Listing
模型has_many :categories, through: :categories_listings
和has_many :categories_listings
。我正在用Factory Girl工厂测试它,看起来像这样:
factory :listing do |f|
f.sequence (:title) { |n| "Listing #{n}" }
message {Faker::Lorem.paragraph}
cards {[FactoryGirl.create(:card)]}
categories {[FactoryGirl.create(:category)]}
association :delivery_condition
association :unit_of_measure
quantity 1
unit_price 1
end
在我向模型添加以下验证之前,一切正常:
validate :has_categories?
def has_categories?
if self.categories_listings.blank?
errors.add :base, "You have to add at least one category"
end
end
现在每当我经营工厂时,我都会得到:
ActiveRecord::RecordInvalid: You have to add at least one category
我也尝试使用像before :create
这样的Factory Girl回调,但问题是我无法添加关联,因为我还不知道回调中的列表ID。但我无法保存列表,因为验证是在关联之前运行的。
我如何解决这个问题并让它发挥作用?
答案 0 :(得分:2)
让它发挥作用。
在我的工厂中,我删除了类别行并添加了before(:create)
回调,建立关系。强调构建,因为它不适用于创建(我在发布问题之前尝试过)。加上构建绕过了我提到的僵局。所以现在,工作工厂看起来像这样:
factory :listing do |f|
f.sequence (:title) { |n| "Listing #{n}" }
message { Faker::Lorem.paragraph }
cards { [FactoryGirl.create(:card)] }
association :delivery_condition
association :unit_of_measure
quantity 1
unit_price 1
before(:create) do |listing|
category = FactoryGirl.create(:category)
listing.categories_listings << FactoryGirl.build(:categories_listing, listing: listing, category: category)
end
end
从this answer获得灵感。