- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个观察者,并且注册了一个 after_commit
回调。如何判断它是在创建还是更新后被触发?我可以通过询问 item.destroyed?
得知某个项目已被销毁,但 #new_record?
由于该项目已保存而不起作用。
我打算通过添加 after_create
/after_update
来解决这个问题,并在内部执行类似 @action = :create
的操作并检查 @action
at after_commit
,但观察者实例似乎是一个单例,我可能只是在它到达 after_commit
之前重写一个值。所以我用一种更丑陋的方式解决了这个问题,根据 after_create/update 上的 item.id 将操作存储在 map 中,并在 after_commit 上检查其值。真的很丑。
还有其他办法吗?
正如@tardate所说,transaction_include_action?
是一个很好的指示,尽管它是一个私有(private)方法,并且在观察者中应该使用#send
访问它。
class ProductScoreObserver < ActiveRecord::Observer
observe :product
def after_commit(product)
if product.send(:transaction_include_action?, :destroy)
...
不幸的是,:on
选项在观察者中不起作用。
只要确保你测试了你的观察者(如果你使用 use_transactional_fixtures,请寻找 test_after_commit
gem),这样当你升级到新的 Rails 版本时,你就会知道它是否仍然有效。
(在3.2.9测试)
我现在使用 ActiveSupport::Concern 代替观察者,并且 after_commit :blah, on: :create
在那里工作。
最佳答案
我认为transaction_include_action?就是你所追求的。它可靠地指示了正在处理的特定事务(已在 3.0.8 中验证)。
正式地,它确定事务是否包含 :create、:update 或 :destroy 操作。用于过滤回调。
class Item < ActiveRecord::Base
after_commit lambda {
Rails.logger.info "transaction_include_action?(:create): #{transaction_include_action?(:create)}"
Rails.logger.info "transaction_include_action?(:destroy): #{transaction_include_action?(:destroy)}"
Rails.logger.info "transaction_include_action?(:update): #{transaction_include_action?(:update)}"
}
end
同样感兴趣的可能是 transaction_record_state它可用于确定事务中是否创建或销毁了记录。状态应该是 :new_record 或 :destroyed 之一。
Rails 4 更新
对于那些寻求解决 Rails 4 中问题的人,此方法现已弃用,您应该使用 transaction_include_any_action?
,它接受操作的 array
。
使用示例:
transaction_include_any_action?([:create])
关于ruby-on-rails - Rails 3 : How to identify after_commit action in observers?(创建/更新/销毁),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7238699/
有没有人实现过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
我是一名优秀的程序员,十分优秀!