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 sí tienen una updated_at
tiempo updated_at
:
if created_at == updated_at
# it''s a newly created record
end