gpt4 book ai didi

ruby-on-rails - 在提交数据库更新后运行 Rails 代码,无需 after_commit

转载 作者:行者123 更新时间:2023-11-29 11:16:20 25 4
gpt4 key购买 nike

我正在尝试使用我的后台任务管理器处理一些竞争情况。本质上,我有一个 Thing 对象(已经存在)并为其分配一些属性,然后保存它。使用新属性保存后,我将其放入 Resque 中,并传入 ID。

thing = Thing.find(1)
puts thing.foo # outputs "old value"
thing.foo = "new value"
thing.save
ThingProcessor.queue_job(thing.id)

后台作业将使用 Thing.find(thing_id) 从数据库中加载对象。

问题是,我们发现 Resque 在接手工作并从 ID 加载 Thing 对象时速度如此之快,以至于它加载了一个陈旧的对象。因此在作业中,调用 thing.foo 仍将返回“旧值”,如 1/100 次(不是真实数据,但这种情况不会经常发生)。

我们知道这是一个竞争案例,因为 Rails 会在数据实际提交到数据库之前从 thing.save 返回(本例中为 postgresql)。

在 Rails 中有没有一种方法只在数据库操作提交后才执行代码?本质上,我想确保在 Resque 加载对象时,它正在获取最新的对象。我知道这可以在 Thing 模型上使用 after_commit Hook 来实现,但我不希望它出现在那里。我只需要在这个特定的上下文中发生这种情况,而不是每次模型将更改提交到数据库时。

最佳答案

您也可以进行交易。就像下面的例子:

transaction do
thing = Thing.find(1)
puts thing.foo # outputs "old value"
thing.foo = "new value"
thing.save
end
ThingProcessor.queue_job(thing.id)

更新:有一个调用 After Transaction 的 gem,用这个你可以解决你的问题。链接在这里: http://xtargets.com/2012/03/08/understanding-and-solving-race-conditions-with-ruby-rails-and-background-workers/

关于ruby-on-rails - 在提交数据库更新后运行 Rails 代码,无需 after_commit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18279792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com