2011-08-23 11 views
7

È possibile saltare le convalide con un metodo dinamico di ricerca/creazione?Come ignorare le convalide w/find_or_create_by_?

Per esempio, con regolare risparmio che posso fare qualcosa di simile:

p = Post.new 
p.title = nil 
p.body = nil 
p.save(:validate => false) 

piacerebbe fare lo stesso con find_or_create_by_title.

risposta

13

Non sembra possibile con lo code in Rails right now tuttavia è meglio avere un po 'più di dettaglio nel modo in cui si scrive il codice. È possibile utilizzare find_or_initialize_by_ che crea un nuovo oggetto ma non lo salva. È possibile quindi chiamare risparmia con le opzioni personalizzate, anche nel documentation hanno una dimostrazione pulito che è difficile da trovare quindi mi includere qui sotto:

# No 'Winter' tag exists 
winter = Tag.find_or_initialize_by_name("Winter") 
winter.new_record? # true 

Buona fortuna e fatemi sapere se avete bisogno di più puntatori in la giusta direzione.

+0

Grazie mille. È così che sono andato! Apprezzo il fatto di aver trovato il tempo di rispondere. –

1

Per alcuni casi, find_or_initialize_by_ non sarà utile e sarà necessario saltare le convalide con find_or_create_by.

Per questo, è possibile utilizzare sotto flusso alternativo e modo di ROR:

  • Aggiornare il modello come questo:

classe Messaggio < ActiveRecord :: Base

attr_accessor: skip_validation
appartiene a: utente
validates_presence_of: title, a meno che:: skip_validation

fine

  • Si può usare ora in questo modo:
    Post.where(user_id: self.id).first_or_create!(skip_validation: true)

ho usato first_or_create invece di find_or_create_by qui. Puoi passare più nomi e valori di colonna con questo, e la tua convalida non verrà risolta con questo.

  • È possibile continuare senza alcuna modifica per la forte parametri fine e non c'è bisogno di permettere questo 'skip_validation' in modo che possa funzionare con le convalide mentre l'aggiunta di voci.

  • Utilizzando questo, è possibile utilizzarlo con e senza convalida passando un parametro.

Problemi correlati