it-swarm-ru.tech

Как определить, была ли запись только создана или обновлена ​​в after_save

#New_record? Функция определяет, была ли запись сохранена. Но это всегда ложно в хуке after_save. Есть ли способ определить, является ли запись вновь созданной или старой записью из обновления?

Я надеюсь не использовать другой обратный вызов, такой как before_create, чтобы установить флаг в модели или запросить другой запрос в БД.

Любой совет приветствуется.

Правка: необходимо определить его в ловушке after_save, и для моего конкретного случая использования нет отметки времени updated_at или updated_on

87
Aaron Qian

Я искал использовать это для обратного вызова after_save.

Более простое решение - использовать id_changed? (так как он не изменится на update) или даже created_at_changed?, если присутствуют столбцы меток времени.

Обновление: Как указывает @mitsy, если эта проверка необходима вне обратных вызовов, используйте id_previously_changed?. Смотрите документы .

153
Zubin

Никакого Rails волшебства здесь, о котором я знаю, вам придется делать это самостоятельно. Вы можете очистить это с помощью виртуального атрибута ...

В вашем классе модели:

def before_save
  @was_a_new_record = new_record?
  return true
end

def after_save
  if @was_a_new_record
    ...
  end
end
30
Jeff Paquette

Еще один вариант для тех, кто делает имеет отметку времени updated_at:

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

Существует обратный вызов after_create, который вызывается, только если запись является новой записью, после ее сохранения . Существует также обратный вызов after_update для использования, если это была существующая запись, которая была изменена и сохранена. Обратный вызов after_save вызывается в обоих случаях после вызова after_create или after_update.

Используйте after_create, если вам нужно, чтобы что-то произошло один раз после сохранения новой записи.

Более подробная информация здесь: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

23
sharpone

Поскольку объект уже был сохранен, вам нужно посмотреть на предыдущие изменения. Идентификатор должен изменяться только после создания.

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

Существует также переменная экземпляра @new_record_before_save. Вы можете получить к нему доступ, выполнив следующие действия:

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

Оба довольно уродливы, но они позволят вам узнать, был ли объект заново создан. Надеюсь, это поможет!

16
Tom Rossi