2011-02-11 11 views
7

En rieles tengo la amabilidad de alterar los datos de producción para adaptarse a las nuevas reglas de validación, hay varias cosas mal, así que tengo 2 migraciones diferentes (podrían ser una pero dos aspectos que ejecutar por separado) uno falla porque el otro validación no se cumple y viceversaOmitir validaciones durante una migración solo de datos para corregir errores de validación

la validación es nuevo en el modelo como

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" 

es un tipo que es completamente nueva y el otro acaba de cambiar de 24 a 8 y agregó el bit de horas extra

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 

intenté pedir las migraciones y obtuve el resultado inverso.

¿Hay alguna otra manera además de actualizar la base de datos primero y luego actualizar este archivo para omitir eso? o es eso lo que debería estar haciendo?

Respuesta

21

en Rails 2:

object.save(false) 

en Rails 3 & 4:

object.save(:validate => false) 

Estos métodos pasará por alto cualquier y todas las validaciones en el objeto, así que tenga cuidado!

+0

Supongo que existe para hacer que eludir solo alguna validación. solo chekcing – loosecannon

+0

funciona para object.save! también – loosecannon

+0

La diferencia de usar un hash es importante aquí. El primero no funcionará en Rails 2. –

1

Hola, sé que esta es una pregunta antigua y ya está respondida, pero en base a su comentario, pensé que dejaría mi granito de arena.

No es posible en Rails 2 o 3 activar o desactivar una sola validación. Sin embargo, utilizamos tareas de población extensamente en nuestros proyectos, por lo que tenemos una pequeña solución para el mismo.

Es un poco tedioso si quieres hacerlo para cada validación, pero en general el que quieres "apagar" por un tiempo son pocos y distantes.

class FooModel < ActiveRecord::Base 

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

end 

Si usted sigue una fuerte convención de nombres, cuando se crea un objeto, se puede establecer la sencilla dont_check_ apropiada * * validation_name a la verdadera y pasará por la validación.

Además, para su segundo comentario, lo siguiente:

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

funcionan de la misma manera.

Y, por supuesto, la validación condicional que mencioné también funciona en ambos.

+0

hmm interesting. Ya no trabajo en lo que sea que lo requiera, pero me gusta esa idea. – loosecannon

Cuestiones relacionadas