2010-03-18 7 views
7

Ben tanımlanan bir modeliBen benzersiz değerler elde etmek Factory Girl bir diziyi kullanıyorum ama doğrulama hatalarını alıyorum

class Lga < ActiveRecord::Base 
    validates_uniqueness_of :code 
    validates_presence_of :name 
end 

Ben

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 
ile Lgas için bir fabrika tanımladığınız bu şekilde Ben

olsun ben script/console içinde

Factory.create(:lga) 
Factory.create(:lga) 

çalıştırmak Ancak

,

>> 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 

cevap

7

sorun code ve name nitelikleri böylece tembel nitelikleri denilen değildi olmasıydı. Ben böyle bir şey yazma düşünmüştü:

Factory.define :lga do |l| 
    l.code { |n| "lga_#{n+10000}" } 
end 

ama çok name özelliğindeki id yeniden istedi.her after_build kancaya koyarak, id yerine dikkatle değerlendirilebilir.

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 

Bu yalnızca FactoryGirl 1.2.3 ve sonraki sürümlerde çalışır.

+0

ben size son örnek kod bloğunda bir hata ayıklayıcı hattını bıraktım düşünüyorum;) –

+0

@Ganesh. Teşekkürler. Sabit. –

2

Önceki yanıt hala doğru ama FactoryGirl'in daha yeni sürümlerinde bir uyarı alacaksınız.

Factory.next has been depreciated. Use FactoryGirl.generate instead. 

Yeni Kod aşağıdaki gibi görünmelidir:

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 

Kaynak: http://notesofgreg.blogspot.co.uk/2012/07/foolproof-factorygirl-sequence.html

İlgili konular