Pregunta

Estoy buscando una variación del #save Método que solo guardará atributos que no tienen errores adjuntos a ellos.Por lo tanto, un modelo se puede actualizar sin ser válido en general, y esto aún evitará guardar datos no válidos en la base de datos.

Por "atributos válidos", me refiero a aquellos atributos que dan cero al llamar a @model_instance.errors.on(:attribute)

¿Alguien tiene una idea de cómo lograr esto?

Hasta ahora tengo lo siguiente:

def save_valid_attributes 
 valid? 
 update_atrtibutes attributes.inject({}){|k, v, m| m[k] = v unless errors_on(k.to_sym); m} 
end 

Esto funciona si no se realiza ningún procesamiento en la asignación, que en mi caso sí lo hay.Por ejemplo, tengo una columna de base de datos "start_date" y dos métodos definidos:

def nice_start_date=(startdate)
 self.start_date = Chronic.parse(startdate) || startdate
end

def nice_start_date
 self.start_date.to_s
end

Estos dos métodos me permiten analizar correctamente las fechas ingresadas por el usuario usando Chronic antes de guardarlas.Entonces, segunda forma de hacer esto, un atributo a la vez:

def save_valid_attributes(attrib) 
  valid?
  attrib.each{|(k,v)| send("${k}=", v); save; reload)
end

El modelo debe recargarse cada vez ya que, si una de las fechas no es válida y no se guarda, impedirá que se guarden todos los atributos adicionales.

¿Hay una mejor manera de hacer esto?Estoy seguro de que este no es un problema poco común en el mundo Rails, simplemente parece que no puedo encontrar nada en el universo de conocimiento de Google.

¿Fue útil?

Solución

No estoy seguro de cuánta suerte tendrás con esto sin perder mucho tiempo.

No importa cuán DRY, OO y fácil haga las cosas su marco (que en este caso es mucho =), aún debe recordar que se está ejecutando frente a una base de datos relacional estándar, que tiene confirmaciones atómicas como una de sus definiendo características.Está diseñado desde cero para garantizar que se realicen todos los cambios o ninguno.

Efectivamente, vas a superar esta funcionalidad estándar con algo que va 100% en contra de cómo Rails + fue diseñado para funcionar.Es probable que esto conduzca (como ya se dijo) a datos inconsistentes.

Una vez dicho esto ...siempre es posible.Buscaría hacer una validación manual de los atributos que le interesan y luego usar el método incorporado. object.update_attribute_with_validation_skipping.

¡Buena suerte!

Otros consejos

Puedes sobrescribir #save como esto:

def save
  errors.each do |attr, msg|
    send("#{attr}=", send("#{attr}_was"))
  end
  super
end

Esto restablecerá todos los atributos con errores adjuntos a su valor original.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top