2009-03-29 11 views
5

Así que he estado tirando de mi cabello solucionando este error que he estado teniendo, y finalmente descubrí lo que lo estaba causando. Siempre había estado bajo la impresión de que cuando llamémy_object.save (falso) no omite REALMENTE mis validaciones de Active Record

@my_model.save(false) 

que iba a ser saltarse mis validaciones ActiveRecord. Resulta que esto es parcialmente cierto. Mis objetos están guardando en la base de datos A PESAR mi validación de ActiveRecord. Mi problema existe porque una de mis validaciones modifica uno de los modelos hijos durante el proceso de validación (Esta es una aplicación de programación para una ubicación de 24 horas, por lo tanto, cuando se guardan almuerzos, los controlo contra el día en que se guardan, Y al día siguiente también para asegurarse de que el usuario no quiso decir "2am" para un turno de noche.

Mi pregunta es esta: ¿hay alguna manera de saltear mis validaciones y pasar directamente a la base de datos? ¿Es este comportamiento normal de ActiveRecord o ¿Debería profundizar en mis validaciones? ¿O no tengo suerte y necesito volver a escribir mis validaciones?

+0

Así que estás diciendo que el código de validación todavía se está ejecutando, es simplemente ignorar el resultado de ellos, y esto es un problema ya que modifica el modelo en sus validaciones. Usaría algo más que validaciones para desinfectar los datos. – bhollis

+0

¡Eso es exactamente! Supongo que esa es mi respuesta definitiva, pero pensé que probaría suerte para ver si podía encontrar otra. – BushyMark

+0

Usar validaciones para postprocesar sus objetos comerciales es definitivamente un olor. Las validaciones están destinadas a verificar datos, no a modificarlos. Para modificar, use los diversos ganchos de ciclo de vida de ActiveRecord en su lugar: antes/después de guardar, antes/después de crear, etc. – Matthias

Respuesta

6

Puede usar before_create u otra devolución de llamada para interactuar con el registro antes de guardarlo en la base de datos que tratar de hacer esto dentro de un validador.

Aquí está la documentación sobre las devoluciones de llamada ActiveRecord: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

Hay también una guía sobre el uso de las devoluciones de llamada con algunos detalles sobre cómo saltar aquí: Existe http://guides.rubyonrails.org/activerecord_validations_callbacks.html

12

Mi problema porque uno de mis validaciones modifican uno de los modelos secundarios durante el proceso de validación

Corregir eso, entonces su pr Los problemas desaparecerán. ¡Las validaciones nunca deberían modificar los objetos!

3

Estoy de acuerdo con Orion, nunca use una validación para modificar un objeto, use una devolución de llamada como after_save en su lugar.

+0

Quien haya votado negativamente, necesita reconsiderar algunas cosas. Las validaciones son para validación. Si no estás de acuerdo, comenta y podremos ver cuál es tu teoría. – nitecoder

5

Acepto, debe usar devoluciones de llamada para interactuar con los registros. Validaciones nunca deben modificar objetos ..

Si todavía se encuentra la necesidad de hacerlo .. utilizar

 
myobject.save_without_validation 
Cuestiones relacionadas