【发布时间】:2011-09-19 07:33:43
【问题描述】:
after_create 和 after_save 在功能上是否相同?
我想在创建帐户后对用户的电子邮件进行操作。
我想当它保存在数据库中时执行该操作。
哪个更适合使用:after_create 或 after_save?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3
after_create 和 after_save 在功能上是否相同?
我想在创建帐户后对用户的电子邮件进行操作。
我想当它保存在数据库中时执行该操作。
哪个更适合使用:after_create 或 after_save?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3
after_save()
当您必须保存不经常保存的模型时效果很好。 对于这个频繁更改记录的特殊示例,建议使用
after_commit()
确保在执行操作之前模型已保存在数据库中 after_commit :calculate_credit_score
def calculate_credit_score
#Call a Cron job
end
【讨论】:
after_commit,但不要解释原因。请问你能详细说明吗?请注意,after_commit 在创建、更新和销毁时运行。文档:apidock.com/rails/ActiveRecord/Transactions/ClassMethods/… 所以这与after_save 的行为不一样你真的想在销毁记录后调用那个 cron_job 吗?或者在 ops 的情况下,向现在已删除的用户发送电子邮件?小心使用after_commit
after_commit 在这些 CRUD 操作上运行,因此如果在他的情况下经常更新电子邮件,那么将操作组合起来用于特定回调会更容易。就我而言,我使用了after_commit : calculate_profile_update, on: :update
来自the docs:
after_create()被调用后
Base.save在没有的新对象上 尚未保存(不存在记录)。
after_save()在
Base.save之后调用 (不管是不是创 或更新保存)。
【讨论】:
after_create 只工作一次 - 就在第一次创建记录之后。
after_save 在您每次保存对象时都有效 - 即使您只是在多年后更新它
因此,如果您只想执行此电子邮件操作一次(然后再也不会),请使用after_create。
如果您想每次在保存对象时执行此操作,请在after_save中执行此操作
【讨论】:
update_all 不会调用任何回调,包括after_*