2011-02-11 12 views
7

In rotaie ho l'amigrazione per modificare i dati di produzione per adattarli alle nuove regole di convalida, Ci sono diverse cose sbagliate quindi ho 2 diverse migrazioni (potrebbero essere uno ma ancora due aspetti che gestita separatamente) uno fallisce perché l'altra convalida non è soddisfatta e viceversaConvalida di bypass durante una migrazione di soli dati per correggere gli errori di convalida

la validazione è stata introdotta nel modello come

validates_uniqueness_of :job_id , :scope => [:day, :time, :user_id , :overtime, :comments] , :message => "Duplicate Entry, Please check your data" 
validates_uniqueness_of :job_id , :scope => [:day, :user_id, :comments] , :message => "Has 2 Entires for same job on same day with same comment" 

è un tipo che è completamente nuovo e l'altro appena cambiato da 24 a 8 e aggiunto il bit degli straordinari

validates_numericality_of :time, :greater_than => 0, :less_than_or_equal_to => 8 
    validates_numericality_of :overtime, :greater_than_or_equal_to => 0, :less_than_or_equal_to => 16 

Ho provato a riordinare le migrazioni e ho ottenuto il risultato opposto.

c'è un modo diverso dall'aggiornamento del database prima di aggiornare questo file per ignorarlo? o è quello che dovrei fare?

risposta

21

in Rails 2:

object.save(false) 

in Rails 3 & 4:

object.save(:validate => false) 

Questi metodi bypassare qualsiasi e tutte le convalide sull'oggetto, quindi state attenti!

+0

presumo che ci sia comunque per farlo bypassare solo alcune convalide. solo chekcing – loosecannon

+0

funziona per object.save! anche – loosecannon

+0

La differenza nell'usare un hash è importante qui. Il primo non funzionerà in Rails 2. –

1

Ehi, so che questa è una domanda vecchia e ha già risposto, ma in base al tuo commento ho pensato di lasciare i miei due centesimi.

Non vi è alcun modo in Rails 2 o 3 per attivare o disattivare una singola convalida. Tuttavia, utilizziamo ampiamente le attività relative alla popolazione nei nostri progetti, quindi abbiamo una soluzione alternativa per lo stesso.

È un po 'noioso se si vuole farlo per ogni singola convalida, ma in generale quello che si desidera "disattivare" per un po' sono pochi e distanti tra loro.

class FooModel < ActiveRecord::Base 

    validates_uniqueness_of :foo_name, :unless => :dont_check_foo_name 
    attr_accessor :dont_check_foo_name 

end 

Se si segue una forte convenzione di denominazione, quando si crea un oggetto, è possibile semplice insieme il dont_check_ appropriata * * validation_name true e sarà di by-passare la convalida.

Inoltre, per il secondo commento, quanto segue:

object.save(false) 
object.save!(false) 

lavoro nello stesso modo.

E ovviamente la convalida condizionale che ho menzionato funziona anche su entrambi.

+0

hmm interessante. Non sto più lavorando su quello che è richiesto, ma mi piace l'idea. – loosecannon

Problemi correlati