Tocando a ActiveRecord

Cuando se programan aplicaciones, puede haber ocasiones en donde queremos que un determinado objeto indiqué la última vez que fue actualizado según determinadas acciones o sucesos.

La última vez que se actualizó el repositorio, la última vez que se modificó un artículo publicado, la última vez que cambió el estado de la cuenta, etc. Son ejemplo de lo anterior.

En Rails, se puede lograr dicho comportamiento de dos formas. Depende de uno como programador determinar cual de las dos opciones es más adecuada(o incluso si se usan ambas).

touch(*names)

La primera opción es el método touch del módulo Persistence de ActiveRecord. Se utiliza enviando como parámetro el atributo que se quiera actualizar y por defecto lo hace con el objeto creado por ActiveRecord que tiene toda instancia de un model: updated_at.

book.touch
book.touch(:published_at)

Al llamar a este método, ninguna validación se realiza en el objeto.

Documentación.
Código fuente.

:touch

También se puede usar el método touch como opción en un macro de asociación belongs_to. En este caso lo que hará es actualizar el objecto al que pertenece o está asociado.

class Order < ActiveRecord::Base
  belongs_to :customer, touch: true
end

class Customer < ActiveRecord::Base
  has_many :orders
end

De esta manera, cada que una orden(Order) se actualiza, el cliente(Customer) a quien pertenezca, recibirá una actualización en su atributo updated_at.

Lo único delicado de utilizar esta opción es cuando ocurren muchas actualizaciones seguidas. Por ejemplo:

customer.orders.each do |order|
  # se hace algún trabajo en particular
  order.save
end

Cada que una orden de un cliente se actualicé, se actualizará el atributo updated_at del cliente. Lo que a mí parecer es un detalle menor de desempeño pero que no debería pasarse por alto.

Documentación (buscar :touch).

Ya al final es decisión de uno como desarrollador decidir cual de las dos opciones sirve más para el caso particular, sin embargo, siempre es ideal entender cómo funcionan en detalle para identificar los por menores posibles.

Anuncios

Autor: cesc1989

Ingeniero de Sistemas que le gusta escribir y compartir sobre recursos que considera útiles, además que le gusta leer manga y ver anime.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s