Cuando nos encontramos trabajando con los modelos de Ruby on Rails concretamente con el Active Record, existe una gran variedad de métodos con los cuales podemos actualizar registros en nuestra base de datos. Si bien estos métodos realizan la actualización de forma correcta, cada uno debe de ser utilizado en casos específicos. En este post explicaremos los métodos más populares al momento de actualizar registros.
Métodos
En esta ocasión estaremos trabajando con métodos de instancia.
- save
- update
- update_attribute
- update_attributes
- update_column
- update_columns
Para este post me encontraré trabajando con mi modelo User, así, como el versión 5 de Ruby on Rails.
rails g model User username:string email:string password:string
class User < ApplicationRecord
after_save :after_save_method
after_update :after_update_method
before_update :before_update_method
validates_presence_of :username
validate :my_validation
def my_validation
if username == "Codi"
self.erros.add(:username, 'No es posible almacenar Codi!')
end
end
private
def after_save_method
puts "Mensaje después de guardar!"
end
def after_update_method
puts "Mensaje después de actualizar!"
end
def before_update_method
puts "Mensaje antes de actualizar!"
end
end
save
El método save nos permite guardar un registro en nuestra base de datos, claro, siempre y cuando las validaciones sean exitosas. Si el registro no existe, entonces este, se creará.
user = User.new username:'Codi1', password:'password'
user.save
(0.1ms) begin transaction
SQL (1.1ms) INSERT INTO "users" ("username", "password", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["username", "Codi1"], ["password", "password"], ["created_at", "2018-08-22 20:33:41.552450"], ["updated_at", "2018-08-22 20:33:41.552450"]]
Mensaje después de guardar!
(1.2ms) commit transaction
=> true
El método save hará que todos los callbacks, before y after save se ejecuten.
Si nosotros hacemos uso de este método cuando el registro ya existe en la base de datos, entonces, se procederá a actualizar dicho registro.
user = User.last
user.username = 'Cambio de nombre'
user.save
(0.1ms) begin transaction
Mensaje antes de actualizar!
SQL (0.4ms) UPDATE "users" SET "username" = ?, "updated_at" = ? WHERE "users"."id" = ? [["username", "Cambio de nombre"], ["updated_at", "2018-08-22 20:37:25.698688"], ["id", 2]]
Mensaje después de actualizar!
Mensaje después de guardar!
(1.2ms) commit transaction
=> true
Al actualizar el registro se ejecutarán todos los callbacks, before y after, save y update.
update
Con el método update podemos actualizar un registro existente en la base de datos. Como argumentos nosotros colocaremos todos los atributos que deseamos actualizar, con su correspondiente nuevo valor.
Al igual que con el método save, la actualización se hará, siempre y cuando las validaciones sean exitosas.
user = User.last
user.update username: 'Cambio de nombre'
(0.2ms) begin transaction
Mensaje antes de actualizar!
SQL (0.3ms) UPDATE "users" SET "username" = ?, "updated_at" = ? WHERE "users"."id" = ? [["username", "Cambio de nombre"], ["updated_at", "2018-08-22 20:41:24.996086"], ["id", 2]]
Mensaje después de actualizar!
Mensaje después de guardar!
(2.5ms) commit transaction
=> true
Al actualizar el registro se ejecutarán todos los callbacks, before y after, save y update, tal y como sucede con el método save.
update_attribute
Este método nos permite actualizar un solo atributo de nuestro registro. El método recibe dos argumentos, el atributo a modificar y el nuevo valor.
Al trabajar con este método debemos de tener un poco de precaución, ya que actualizará el registro sin realizar ningún tipo de validación.
user = User.last
user.update_attribute :username, 'Codi'
(0.5ms) begin transaction
Mensaje antes de actualizar!
SQL (0.8ms) UPDATE "users" SET "username" = ?, "updated_at" = ? WHERE "users"."id" = ? [["username", "Ismael"], ["updated_at", "2018-08-22 20:57:40.400832"], ["id", 2]]
Mensaje después de actualizar!
Mensaje después de guardar!
(1.1ms) commit transaction
=> true
Al actualizar el registro se ejecutarán todos los callbacks, before y after, save y update.
update_attributes
Este método nos permite actualizar múltiples atributos de nuestro registro, siempre y cuando las validaciones sean exitosas.
user = User.last
user.update_attributes username:'Codi1', password:'new_password'
(0.1ms) begin transaction
Mensaje antes de actualizar!
SQL (0.5ms) UPDATE "users" SET "username" = ?, "password" = ?, "updated_at" = ? WHERE "users"."id" = ? [["username", "Codi1"], ["password", "new_password"], ["updated_at", "2018-08-22 21:05:49.930859"], ["id", 2]]
Mensaje después de actualizar!
Mensaje después de guardar!
(3.3ms) commit transaction
=> true
Al actualizar el registro se ejecutarán todos los callbacks, before y after, save y update.
update_column
Este método nos permite actualizar una sola columna de nuestro registro. Tanto los callbaks como las validaciones serán omitidas, el atributo updated_at no será actualizado, así que hay que tener mucho cuidado al utilizar este método.
user = User.last
user.update_column :username, 'Codi'
SQL (4.4ms) UPDATE "users" SET "username" = 'Codi' WHERE "users"."id" = ? [["id", 2]]
=> true
update_column es la forma más rápida que tenemos para realizar una actualización, esto principalmente, ya que omitimos validaciones, callbacks, así como transacciones a nivel de base de datos.
update_columns
update_columns se comporta prácticamente igual que update_column, la única diferencia es que con este método podemos actualizar más de una columna de nuestro registro.
user = User.last
user.update_columns username:'Codi', password:'Nueva password'
SQL (1.5ms) UPDATE "users" SET "username" = 'Codi', "password" = 'Nueva password' WHERE "users"."id" = ? [["id", 2]]
=> true
Comentarios finales
Es importante mencionar que todos estos métodos retornarán un valor booleano dependiendo del resultado de la transacción/sentencia. El resultado será true, cuando el registro se haya actualizado correctamente, en caso contrario será false.
Conclusión
Existe una gran variedad de métodos que nos permiten actualizar registros en nuestra base de dato, es importante conocerlos para así tomar la mejor decisión sobre cuándo utilizarlos, de esta forma nos evitaremos comportamientos "No esperados" en nuestra aplicación, y con esto algunos dolores de cabeza ☕.