ruby-on-rails - Rails after_save 和 after_commit 陷阱

标签 ruby-on-rails

after_save在保存记录时调用(但在提交之前)。同时 after_create在提交数据库事务之后调用。

除了这篇文章http://www.justinweiss.com/articles/a-couple-callback-gotchas-and-a-rails-5-fix/这解释了 Sidekiq 作业找不到对象,因为代码在对象提交之前运行,我需要知道哪些其他陷阱才能决定是否 after_createafter_commit哪个更适合使用?

最佳答案

如果您想避免 Sidekiq 像您描述的那样“太快”,我最常看到的解决方案是使用 after_commit

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

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

当然,after_commit也会响应on: :updateon: create,比如before_save

在这里,您可以在作业中确保作业之前未发送,但这仍然可能触发重新发送,即使您已经确保了这一点。

这里面很容易死循环,一不小心可能会损失不少。

关于ruby-on-rails - Rails after_save 和 after_commit 陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43469086/

相关文章:

ruby-on-rails - 使用 Rails(HTTP 请求)连接到 Web 服务?

html - 表单验证失败后表单上的单选按钮无法正确呈现 - bootstrap

ruby-on-rails - 意外的 keyword_end,期望输入结束

ruby-on-rails - Rails ActiveRecord::多参数分配错误

ruby-on-rails - 使用 Chef Cookbook ec 部署 Ruby on Rails 应用程序

ruby-on-rails - 失败 : Expected 0 to be >= 1 on ruby on rails

ruby-on-rails - Rails 路由中的变量

ruby-on-rails - rails/事件记录 : save changes to a model's associated collections

javascript - rails |如何访问 js.erb 文件中的哈希值

javascript - 模态中的 gmaps4rails 不会加载全宽