【问题标题】:What is the difference between `after_create` and `after_save` and when to use which?`after_create` 和 `after_save` 有什么区别,什么时候使用?
【发布时间】:2011-09-19 07:33:43
【问题描述】:

after_createafter_save 在功能上是否相同?

我想在创建帐户后对用户的电子邮件进行操作。

我想当它保存在数据库中时执行该操作。

哪个更适合使用:after_createafter_save

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:
    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
    【解决方案2】:

    来自the docs

    after_create()

    被调用后 Base.save 在没有的新对象上 尚未保存(不存在记录)。

    after_save()

    Base.save 之后调用 (不管是不是创 或更新保存)。

    【讨论】:

      【解决方案3】:

      after_create 只工作一次 - 就在第一次创建记录之后。

      after_save 在您每次保存对象时都有效 - 即使您只是在多年后更新它

      因此,如果您只想执行此电子邮件操作一次(然后再也不会),请使用after_create

      如果您想每次在保存对象时执行此操作,请在after_save中执行此操作

      【讨论】:

      • 读者请注意,according to the docs,ActiveRecord 的update_all 不会调用任何回调,包括after_*
      猜你喜欢
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 2015-11-30
      • 2011-12-29
      • 2021-11-17
      • 2010-10-28
      • 2019-06-23
      • 1970-01-01
      相关资源
      最近更新 更多