ruby-on-rails - update_columns - update_attributes rails
¿Cuándo uso save! y update_attributes! en Rails? (2)
¡Estoy tratando de descubrir cuándo usar el bang! versiones para guardar y actualizar registros? He leído y escuché que no los necesita si solo está guardando un registro o actualizando un solo atributo, si está seguro de que nada debería salir mal, o si los usa siempre fuera de un controlador. Supongo que estoy paranoico por tener varias cosas que se guardan y luego falla algo, entonces hay datos incompletos en el DB. El proyecto actual de Rails en el que estoy trabajando está más del 50% completo y actualmente no contiene ningún flequillo. Tengo algunos métodos personalizados a los que llamo en modelos que actualizan o crean múltiples registros y me preocupa si deberían estar en algún tipo de transacción.
Lo siento si esto parece estar disperso, pero estoy tratando de averiguar cómo usar las capacidades de guardado en ActiveRecord correctamente y hacer mi vida más fácil y al final no me da más estrés. Gracias por tu tiempo.
En general, desea utilizar las versiones que no son de explosión en sus controladores. Esto permite una lógica como esta:
def update
@model = Model.find params[:id]
if @model.update_attributes params[:model] #returns true of false
# handle success
else
# handle failure
end
end
Me encuentro usando mucho las versiones de bang cuando quiero asegurarme de saber si algo no valida y no se guarda. Definitivamente he desperdiciado las pruebas de depuración del tiempo que estaban fallando debido a las validaciones modificadas del modelo, lo que sería obvio si utilizo las versiones de bang.
p.ej
it "should do something" do
m = Model.create! :foo => ''bar'' # will raise an error on validation failure
m.should do_something
end
En términos de no tener datos no válidos en la base de datos, debe manejar esto con las validaciones de ActiveRecord (por ejemplo, validates_presence_of :user_id
) o definir su propio método de validate
en el modelo. ( http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html ) Esto evitará que ocurran salvaciones si sus datos no son válidos. Si eres realmente paranoico, puedes agregar algunas restricciones a tu base de datos. Consulte los documentos de ActiveRecord::Migration
para saber cómo configurar índices únicos y otras restricciones de base de datos en sus migraciones.
También en mi experiencia, desea evitar el uso de guardar personalizado o crear método siempre que sea posible. Si vuelve a implementar la funcionalidad incluida en ActiveRecord, termina pagando un precio más adelante. http://matthewpaulmoore.com/post/5190436725/ruby-on-rails-code-quality-checklist tiene más que decir al respecto.
La principal diferencia es cómo se manejan los rescates fallidos. Al actualizar una clase ActiveRecord,! la versión generará una excepción si el registro no es válido.
Recomiendo leer los documentos aquí - http://api.rubyonrails.org/classes/ActiveRecord/Base.html
Usar transacciones también puede ser algo que valga la pena investigar - http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html