我使用的是序列工厂女孩获得独特的价值观,但我得到验证错误
-
21-09-2019 - |
题
我有限定的本方式的模型
class Lga < ActiveRecord::Base
validates_uniqueness_of :code
validates_presence_of :name
end
我定义为L气体工厂与
Factory.sequence(:lga_id) { |n| n + 10000 }
Factory.define :lga do |l|
id = Factory.next :lga_id
l.code "lga_#{id}"
l.name "LGA #{id}"
end
然而,当我运行
Factory.create(:lga)
Factory.create(:lga)
在script/console
我得到
>> Factory.create(:lga)
=> #<Lga id: 2, code: "lga_10001", name: "LGA 10001", created_at: "2010-03-18 23:55:29", updated_at: "2010-03-18 23:55:29">
>> Factory.create(:lga)
ActiveRecord::RecordInvalid: Validation failed: Code has already been taken
解决方案
问题是code
和name
属性未所谓的懒惰属性。我曾想过写东西喜欢的:
Factory.define :lga do |l|
l.code { |n| "lga_#{n+10000}" }
end
但我想重用在name
属性的ID了。您可以确保
比id
每次评估Factory.create
通过把它在一个after_build
钩调用。
Factory.define :lga do |l|
l.after_build do |lga|
id = Factory.next :lga_id
lga.code = "lga_#{id}"
lga.name = "LGA #{id}"
end
end
在FactoryGirl 1.2.3这仅适用于以上。
其他提示
在前面的回答仍然是正确的,但在FactoryGirl的新版本,你会得到一个警告。
Factory.next has been depreciated. Use FactoryGirl.generate instead.
新代码应该是这样的:
Factory.define :lga do |l|
l.after_build do |lga|
id = FactoryGirl.generate :lga_id
lga.code = "lga_#{id}"
lga.name = "LGA #{id}"
end
end
来源: http://notesofgreg.blogspot.co。英国/ 2012/07 /万无一失-factorygirl-sequence.html
不隶属于 StackOverflow