我正在尝试与我的后台任务管理器对抗一些比赛案例。本质上,我有一个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 在获取工作和Thing
从 ID 加载对象方面非常快,以至于它加载了一个陈旧的对象。所以在工作中,调用thing.foo
仍然会返回 1/100 倍的“旧值”(不是真实数据,但它并不经常发生)。
我们知道这是一个竞争案例,因为 rails 会thing.save
在数据实际提交到数据库之前返回(在这种情况下是 postgresql)。
Rails 有没有办法只在数据库操作提交后执行代码?本质上,我想确保在 Resque 加载对象时,它正在获取最新的对象。我知道这可以使用模型after_commit
上的钩子来实现Thing
,但我不希望它在那里。我只需要在这个特定的上下文中发生这种情况,而不是每次模型提交更改到数据库时。