- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
更新:
对 update_attributes 的调用是否会获得它自己的事务?
我看过 this问题以及除该问题之外的其他原因,我决定将 after_commit 作为正确的钩子(Hook)。问题是它被多次(恰好三次)调用。代码解释起来有点复杂,但基本上有一个配置文件模型
include Traits::Blobs::Holder
module ClassMethods
def belongs_to_blob(name, options = {})
clazz = options[:class_name] ? options[:class_name].constantize : Blob
foreign_key = options[:foreign_key] || :"#{name}_id"
define_method "save_#{name}" do
blob = self.send(name)
if self.errors.any? && blob && blob.valid?
after_transaction do
blob.save!
#self[foreign_key] = blob.id
#save resume anyway
self.update_attribute(foreign_key, blob.id)
end
end
end
after_validation "save_#{name}"
belongs_to name, options
accepts_nested_attributes_for name
end
end
after_commit :send_messages_after_registration!
protected
def send_messages_after_registration!
Rails.logger.debug("ENTERED : send_messages_after_registration " + self.owner.email.to_s)
if self.completed?
Rails.logger.debug("completed? is true " + self.owner.email.to_s)
JobSeekerNotifier.webinar_notification(self.owner.id).deliver
Resque.enqueue_in(48.hours, TrackReminderWorker, self.owner.id)
end
end
def create
@user = Customer.new(params[:customer].merge(
:source => cookies[:source]
))
@user.require_password = true
respond_to do |f|
if @user.save
promote_provisional_user(@user) if cookies[:provisional_user_id]
@user.profile.update_attributes(:firsttime => true, :last_job_title => params[:job_title]) unless params[:job_title].blank?
if params[:resume]
@user.profile.firsttime = true
@user.profile.build_resume(:file => params[:resume])
@user.profile.resume.save
@user.profile.save
end
...
end
最佳答案
所以它发生了 3 次,因为配置文件被保存了 3 次:一次是保存用户时(我假设 User accepts_nested_attributes_for :profile
,一次是当你调用 update_attributes(:first_time => true,...)
时,一次是当你在 if params[:resume]
block 中调用 save 时。每次保存创建一个新事务(除非一个已经在进行中)你最终会多次调用 after_commit
after_commit
确实需要 :on
选项(可以取值 :create
, :update
, :destroy
),以便您可以将其限制为新记录。这显然会在第一次保存时触发,因此您将无法看到个人资料的简历等等。
您还可以将所有这些更新包装在单个事务中,在这种情况下 after_commit
只被调用一次,无论通过执行类似的操作在事务中进行了多少次保存
User.transaction do
if @user.save
...
end
end
ActiveRecord::Rollback
)
关于ruby-on-rails - after_commit 回调被多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8750459/
有没有人实现过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
我是一名优秀的程序员,十分优秀!