after_save
。在提交数据库事务之后,调用after_create
。
除了解释Sidekiq作业的帖子http://www.justinweiss.com/articles/a-couple-callback-gotchas-and-a-rails-5-fix/之外找不到对象因为代码在提交对象之前运行,我需要知道的其他问题才能决定什么{{1或after_create
更适合使用?
答案 0 :(得分:5)
如果您正试图避免Sidekiq“太快”,正如您所描述的那样,我最常见的解决方案是使用after_commit
。
这有一个很大的缺点 - 如果您正在更新模型中的某些内容,after_commit
挂钩将再次运行。确保永远不会发生这种情况。
参见示例:
您正在创建TextMessage
并使用status='unsent'
将其保存到数据库,并在after_commit
挂钩中添加SidekiqJob,以便通过API将其发送到您的SMS网关。
此API返回一个ID,用于远程跟踪它,然后将其更新为之前的TextMessage。这将触发重新发送TextMessage。
当然,after_commit
也会响应on: :update
和on: create
,就像before_save
等一样。
在这里,你可以在工作中确保之前的工作是unsent
,但这可能仍会触发重新发送,即使你已经确定了这一点。
在这里制作无限循环很容易,如果你不小心,可能会花费很多。