update_columns update_attributes update rails ruby-on-rails activerecord transactions

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.