У меня есть модель, определил этот путь
class Lga < ActiveRecord::Base
validates_uniqueness_of :code
validates_presence_of :name
end
Я определил фабрику для Lgas с
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
но я хотел повторно использовать id в атрибуте name
. Вы можете сделать так.
чем 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 и выше.