Pregunta Cómo determinar si un registro acaba de crearse o actualizarse en after_save


El #new_record? función determina si se ha guardado un registro. Pero siempre es falso en el after_save gancho. ¿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 establecer un indicador en el modelo o requerir otra consulta en el db.

Cualquier consejo es apreciado.

Editar: necesita determinarlo en after_save gancho, y para mi caso de uso particular, no hay updated_at o updated_on marca de tiempo


75
2018-02-11 23:30


origen


Respuestas:


Estaba buscando usar esto para una after_save llamar de vuelta.

Una solución más simple es usar id_changed? (ya que no cambiará en 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, utilice id_previously_changed?. Ver documentos.


139
2017-08-25 00:41



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

28
2018-02-12 00:58



Otra opción, para aquellos que hacer tener un updated_at fecha y hora:

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

21
2018-02-05 00:28



Hay un after_create devolución de llamada que solo se llama si el registro es un nuevo registro, después de que se guarda. También hay un after_update devolución de llamada para su uso si este era un registro existente que se modificó y guardó. los after_save se llama a la devolución de llamada en ambos casos, después de que after_create o after_update se llama.

Utilizar 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


19
2017-11-28 21:25



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!


12
2017-09-15 17:36