arrow_back Volver
Inicio keyboard_arrow_right Artículos keyboard_arrow_right Artículo

Actualizar registros en Ruby on Rails

Eduardo Ismael Garcia

Full Stack Developer at Código Facilito.

av_timer 4 Min. de lectura

remove_red_eye 10208 visitas

calendar_today 24 Agosto 2018

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 ☕.

Aumenta tu productividad con GitHub Copilot

  • done Curso GRATUITO
  • done Regístrate antes del 31 de Marzo
  • done Obtén una ventaja competitiva
  • done Aprovecha la IA a tu favor
Más información