- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用我的后台任务管理器处理一些竞争情况。本质上,我有一个 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/
有没有人实现过after_commit卡在 Rails 中?我不是在更新/创建/等提交后寻找基于模型的模型,我希望能够动态定义一个只有在当前(最顶层)事务通过时才会执行的 block : def re
更新: 对 update_attributes 的调用是否会获得它自己的事务? 我看过 this问题以及除该问题之外的其他原因,我决定将 after_commit 作为正确的钩子(Hook)。问题是它
我在 Rails 3.0.8 上并尝试使用 after_commit 回调。 它在这里定义:https://github.com/rails/rails/blob/v3.0.8/activerecor
我在我的应用程序中使用了 after_commit。 我希望它仅在我的模型中更新特定字段时触发。有人知道怎么做吗? 最佳答案 老问题,但这是我发现的一种方法,可以与 after_commit 回调一起
我的 after_commit 设置如下。 class MyModel < ActiveRecord::Base after_commit { Rails.logger.info ("commit
我已经定义了after_commit回调 update .它不会在 rspec 中触发。 这是我的回调: after_commit :notify_trip, :if => Proc.new { |t
我有一个需要在提交后运行的 sidekiq 作业,但仅在某些情况下而不是所有情况下,以避免 a common race condition . 例如,下面的 after_commit将始终触发,但内部
当我需要在 after_commit, :on => :create 期间更新属性时,我创建了一个无限回调循环.但是,仅当我需要在此回调期间更新对象的属性时才会发生这种情况。有没有办法防止这种情况?我
如果我在 Rails 中有多个相同性质的回调,会不会有冲突?像同一模型的几个 after_commit ? 我想我可以将它们加入一种方法中,但出于可读性原因,我宁愿不.. 最佳答案 不,他们会一个接一
有没有办法在创建记录时跟踪对 after_commit 模型的更改?我尝试过使用脏模块,并且能够在更新记录时跟踪更改,但是在创建记录时不会记录更改。 最佳答案 您不能使用 rails changed?
对于特定的数据库表,我们需要一个始终与数据库同步的内存缓存。我目前的尝试是在 after_commit Hook 中将更改写入缓存 - 这样我们确保不会将任何更改写入缓存,以后可能会恢复。 但是,这种
我想在 destroy 一个对象时跳过 after_commit 回调,而不是使用 on 语法明确指定方法列表. IE。像这样的东西: after_commit :foo, except: [:des
我有以下片段: class Product after_commit :do_something, on: %i(update create) def do_something if # u
我有一个模型 Lead 和一个回调:after_commit :create, :send_to_SPL 我正在使用 Rails-4.1.0、ruby-2.1.1、RSpec。 1) 此规范未通过:
after_save在保存记录时调用(但在提交之前)。同时 after_create在提交数据库事务之后调用。 除了这篇文章http://www.justinweiss.com/articles/a-
我听说 rails 有一个脏/更改标志。是否可以在 after_commit 回调中使用它? 在我的用户模型中,我有: after_commit :push_changes 在 def push_ch
设计激活后我遇到了奇怪的问题。带有回形针属性 has_mongoid_attached_file 的模型返回异常: undefined method `after_commit' for Item:C
我正在尝试使用我的后台任务管理器处理一些竞争情况。本质上,我有一个 Thing 对象(已经存在)并为其分配一些属性,然后保存它。使用新属性保存后,我将其放入 Resque 中,并传入 ID。 thin
我经历了 rails 中 after_save 和 after_commit 回调的差异,我发现的主要差异是 after_commit 在创建和更新时调用,有没有办法只在创建时调用 after_com
我正在以这种方式创建一个 ActiveRecord 事务 ActiveRecord::Base.transaction do MyModel.create!(name: "value") Ot
我是一名优秀的程序员,十分优秀!