考虑使用模型User
,List
和Item
的rails项目。
list.rb
has_many :items
#check if the list has at least one item during save
validate :must_have_one_item_at_least
为此,我有一个这样的工厂:
factory :ordered_list_unpublished, traits: :ordered do
transient do
items_count 5
end
after(:build) do |list, evaluator|
create_list(:item, evaluator.items_count, user: list.user, list: list)
end
end
但由于create(:ordered_list_unpublished)
Validation failed: Items count is zero. Atleast one item must be present.
时,验证会失败
答案 0 :(得分:0)
您正在调用create
,它会在创建后尝试将项目保存到您的数据库中。 after :build
回调将在创建完成后运行,因此它会在添加允许其通过验证的项目之前尝试保存到您的数据库中。
而不是create
尝试
build(:ordered_list_unpublished)
并且您应该可以继续,因为这不会尝试保存模型。
可能需要考虑一下您是否真的需要验证项目数量是否大于1,因为可能存在您想先创建它并稍后添加项目的情况。
另一个考虑因素,当您验证时,您可以指定仅在第一次创建时进行验证,或者忽略第一次创建,然后仅在您更新时进行验证:
validates :email, uniqueness: true, on: :create
validates :email, uniqueness: true, on: :update
答案 1 :(得分:0)
对工厂的这一改变使其有效:
factory :ordered_list_unpublished, traits: [:ordered, :published] do
transient do
items_count 5
end
before(:create) do |list, evaluator|
list.items << build_list(:item, evaluator.items_count, user: list.user, list: list)
end
end
感谢answer