Яка різниця між `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_*
звертається до

93

З документів :

after_create()

Викликається Base.saveза новими об'єктами, які ще не збережені (запис не існує).

after_save()

Викликається після Base.save (незалежно від того, створити чи оновити збереження).


1
after_save()

Чудово працює, коли вам потрібно зберегти моделі, які не економлять дуже часто. Для цього конкретного прикладу часто змінювати записи було б доцільно використовувати

 after_commit()

переконайтеся, що модель збережена в базі даних перед виконанням дії after_commit: izračuna_credit_score

def calculate_credit_score
     #Call a Cron job
end

Ви радите використовувати, after_commitале не пояснюйте, чому. Будь ласка, можете докладно? Зауважте, що він after_commitпрацює на створення, оновлення та знищення. Документи: apidock.com/rails/ActiveRecord/Transaction/ClassMethods/… Отже, це не та сама поведінка, як after_saveВи дійсно хочете викликати цю cron_job після того, як знищили запис? Або у випадку з операційним повідомленням, надіслати електронний лист тепер видаленому користувачеві? Будьте обережні з використаннямafter_commit
rmcsharry

after_commitпрацює на цих операціях CRUD, тож якщо в його випадку електронна пошта оновлюється часто, то було б простіше поєднати дії для конкретного зворотного виклику. У моєму випадку я використовувавafter_commit : calculate_profile_update, on: :update
pensebien
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.