Rails after_save和after_commit gotcha

时间:2017-04-18 09:59:39

标签: ruby-on-rails

保存记录时(但在提交记录之前)会调用

after_save。在提交数据库事务之后,调用after_create

除了解释Sidekiq作业的帖子http://www.justinweiss.com/articles/a-couple-callback-gotchas-and-a-rails-5-fix/之外找不到对象因为代码在提交对象之前运行,我需要知道的其他问题才能决定什么{{1或after_create更适合使用?

1 个答案:

答案 0 :(得分:5)

如果您正试图避免Sidekiq“太快”,正如您所描述的那样,我最常见的解决方案是使用after_commit

这有一个很大的缺点 - 如果您正在更新模型中的某些内容,after_commit挂钩将再次运行。确保永远不会发生这种情况。

参见示例:
您正在创建TextMessage并使用status='unsent'将其保存到数据库,并在after_commit挂钩中添加SidekiqJob,以便通过API将其发送到您的SMS网关。
此API返回一个ID,用于远程跟踪它,然后将其更新为之前的TextMessage。这将触发重新发送TextMessage。

当然,after_commit也会响应on: :updateon: create,就像before_save等一样。

在这里,你可以在工作中确保之前的工作是unsent,但这可能仍会触发重新发送,即使你已经确定了这一点。

在这里制作无限循环很容易,如果你不小心,可能会花费很多。