update rails generate create association active ruby-on-rails activerecord activemodel

ruby-on-rails - generate - ruby rails active record



Cómo determinar si un registro acaba de crearse o actualizarse en after_save (5)

Como el objeto ya se ha guardado, debería ver los cambios anteriores. La ID solo debería cambiar después de crear.

# true if this is a new record @object.previous_changes[:id].any?

También hay una variable de instancia @new_record_before_save . Puede acceder a eso haciendo lo siguiente:

# true if this is a new record @object.instance_variable_get(:@new_record_before_save)

Ambos son bastante feos, pero te permiten saber si el objeto ha sido creado recientemente. ¡Espero que ayude!

El #new_record? función determina si se ha guardado un registro. Pero siempre es falso en el gancho after_save . ¿Hay alguna forma de determinar si el registro es un registro recién creado o uno anterior de la actualización?

Espero no utilizar otra devolución de llamada como before_create para establecer un before_create en el modelo o requerir otra consulta en el db.

Cualquier consejo es apreciado.

Editar: Necesito determinarlo en el gancho after_save , y para mi caso de uso particular, no hay updated_at o updated_on timestamp


Estaba buscando usar esto para una after_save llamada after_save .

Una solución más simple es usar id_changed? (dado que no cambiará en la update ) o incluso created_at_changed? si las columnas de marca de tiempo están presentes.

Actualización: como señala @mitsy, si esta verificación es necesaria fuera de las devoluciones de llamadas, entonces, ¿usar id_previously_changed? . Ver docs .


Hay una after_create llamada after_create que solo se after_create si el registro es nuevo, después de guardarlo . También hay una devolución de llamada after_update para usar si este fue un registro existente que fue cambiado y guardado. Se after_save devolución de llamada after_save en ambos casos, después de after_create a after_create o after_update .

Use after_create si necesita que suceda algo una vez que se haya guardado un nuevo registro.

Más información aquí: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html


No hay magia de rieles aquí que yo sepa, tendrás que hacerlo tú mismo. Podrías limpiar esto usando un atributo virtual ...

En tu clase de modelo:

def before_save @was_a_new_record = new_record? return true end def after_save if @was_a_new_record ... end end


Otra opción más para aquellos que tienen una updated_at tiempo updated_at :

if created_at == updated_at # it''s a newly created record end