В чем разница между `after_create` и` after_save` и когда использовать что?

124

Есть after_createи after_saveтакой же , как в функциональности?

Я хочу выполнить операцию с электронной почтой пользователя после создания его учетной записи.

Я хочу проделать эту операцию, когда она будет сохранена в базе данных.

что предпочтительнее использовать: after_createили after_save?

Свапнил Чинчолкар
источник

Ответы:

212

after_create работает только один раз - сразу после создания записи.

after_save работает каждый раз, когда вы сохраняете объект - даже если вы просто обновляете его много лет спустя

Поэтому, если вы хотите выполнить эту операцию с электронной почтой только один раз (а затем никогда больше), используйте after_create.

Если вы хотите делать это каждый раз при сохранении объекта, то делайте это вafter_save

Тарин Восток
источник
2
читатели должны отметить, что, согласно документации , ActiveRecord update_allне вызывает никаких обратных вызовов, в том числеafter_*
user2426679
93

Из документов :

after_create()

Вызывается после Base.saveдля новых объектов, которые еще не были сохранены (запись не существует).

after_save()

Вызывается после Base.save (независимо от того, создание или обновление сохранения).

Майкл Коль
источник
1
after_save()

Прекрасно работает, когда вам нужно сохранять модели, которые не сохраняются очень часто. Для этого конкретного примера частого изменения записей было бы целесообразно использовать

 after_commit()

перед выполнением действия убедитесь, что модель сохранена в базе данных after_commit: calculate_credit_score

def calculate_credit_score
     #Call a Cron job
end
pensebien
источник
Вы советуете использовать, after_commitно не объясняете почему. Не могли бы вы уточнить? Обратите внимание, что after_commitзапускается при создании, обновлении и уничтожении. Документы: apidock.com/rails/ActiveRecord/Transactions/ClassMethods/ ... Значит, это не то же самое поведение, что и after_saveвы действительно хотите вызвать это cron_job после уничтожения записи? Или в случае ops отправить электронное письмо теперь удаленному пользователю? Будьте осторожны с использованиемafter_commit
rmcsharry 01
after_commitвыполняет эти операции CRUD, поэтому, если в его случае электронное письмо часто обновляется, было бы проще объединить действие для определенного обратного вызова. В моем случае я использовалafter_commit : calculate_profile_update, on: :update
pensebien