【发布时间】:2012-01-05 22:00:57
【问题描述】:
更新: 对 update_attributes 的调用是否会获得它自己的事务?
我查看了this 问题,除了这个问题之外,我决定使用 after_commit 作为正确的钩子。问题是它被多次(恰好三次)调用。代码解释起来有点复杂,但基本上有一个profile模型有
include Traits::Blobs::Holder
在 holder.rb 我有:
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
终于在 profile.rb 中我有了:
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
该方法似乎输入了 3 次。几天来我一直在尝试解决这个问题,因此您可以提供任何指导,我们将不胜感激。
控制器代码:
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
【问题讨论】:
-
个人资料是否调用belongs_to_blob?
-
调用代码是什么样的?
-
用控制器代码更新了我的问题
-
是的。 profile 有这个关联:
belongs_to_blob :resume -
这是一个很好的问题:什么时候调用像 belongs_to_blob 这样的关联方法来处理事务回调?
标签: ruby-on-rails ruby-on-rails-3 callback