2009-03-29 4 views
5

Così mi sono tirato fuori i capelli per la risoluzione di questo errore che ho riscontrato e alla fine ho scoperto che cosa stava causando. Avevo sempre avuto l'impressione che quando ho chiamatomy_object.save (false) non salta VERAMENTE le convalide di Active Record

@my_model.save(false) 

Che sarei stata saltare miei convalide ActiveRecord. Risulta che questo è parzialmente vero. I miei oggetti stanno salvando nel database DESPITE la mia convalida ActiveRecord. Il mio problema esiste perché una delle mie convalide modifica uno dei modelli figli durante il processo di convalida (questa è un'applicazione di pianificazione per un percorso di 24 ore, quindi quando i pranzi vengono salvati, li controllo rispetto al giorno in cui stanno salvando, E il giorno dopo per assicurarsi che l'utente non intendesse "2am" per un turno di notte

La mia domanda è questa: c'è un modo per saltare le convalide e passare direttamente al database? È normale comportamento di ActiveRecord o dovrei approfondire le mie convalide? O sono sfortunato e ho bisogno di riscrivere le convalide?

+0

Quindi mi stai dicendo che il codice di convalida è ancora in esecuzione, è solo ignorando il risultato di loro, e questo è un problema poiché si modifica il modello nelle convalide. Userei qualcosa di diverso dalle convalide per disinfettare i dati. – bhollis

+0

Questo è esattamente! Immagino che questa sia la mia risposta definitiva, ma ho pensato di provare la mia fortuna per vedere se riuscissi a trovarne un'altra. – BushyMark

+0

L'utilizzo di convalide per post-elaborare i tuoi oggetti aziendali è sicuramente un odore. Le convalide servono a verificare i dati, non a modificarli. Per modificare, usa invece i vari hook del ciclo di vita di ActiveRecord: prima/dopo-salva, prima/dopo-crea, ecc. – Matthias

risposta

12

Il mio problema esiste perché uno dei le mie convalide modificano uno dei modelli bambini durante il processo di convalida

Correggere che, quindi il tuo pr gli oblemi andranno via. Le convalide non dovrebbero mai modificare gli oggetti!

3

Sono d'accordo con Orion, non utilizzare mai una convalida per modificare un oggetto, utilizzare invece una richiamata come after_save.

+0

Chi ha downvoted questo, è necessario ripensare alcune cose. Le convalide sono per la convalida. Se non sei d'accordo, per favore commenta e possiamo vedere qual è la tua teoria. – nitecoder

5

Accetto, è necessario utilizzare le richiamate per interagire con i record. Convalide non dovrebbero mai modificare gli oggetti ..

Se ancora a trovare il bisogno di farlo .. utilizzare

 
myobject.save_without_validation