2010-03-18 10 views
7

ho un modello definito in questo modoSto utilizzando una sequenza in Factory Girl per ottenere valori unici, ma sto ottenendo gli errori di convalida

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

ho definito una fabbrica per LGA con

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 

Tuttavia, quando si esegue

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

in script/console ottengo

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

risposta

7

Il problema era che code e name attributi non sono stati così chiamati attributi pigri. Avevo pensato di scrivere qualcosa di simile:

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

ma ho voluto riutilizzare l'id nell'attributo name troppo. Puoi assicurarti che rispetto a id venga valutato ogni volta che Factory.create viene chiamato inserendolo in un hook 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 

Questo funziona solo in FactoryGirl 1.2.3 e versioni successive.

+0

Penso che hai lasciato una linea debugger nel tuo ultimo blocco di codice di esempio;) –

+0

@Ganesh. Grazie. Fisso. –

2

La risposta precedente è ancora corretta, ma nelle versioni più recenti di FactoryGirl verrà visualizzato un avviso.

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

nuovo codice dovrebbe essere simile a questo:

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 

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

Problemi correlati