加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 在after_commit,:on =>:create中更新属性

发布时间:2020-12-16 20:49:28 所属栏目:百科 来源:网络整理
导读:当我需要在after_commit期间更新属性时,我创建了一个无限回调循环:,on = :创建.但是,只有在我需要在此回调期间更新对象的属性时才会发生这种情况.有办法防止这种情况吗?我可以以某种方式强制模型重新加载自己,因此它知道它正在执行更新而不是创建吗? cla
当我需要在after_commit期间更新属性时,我创建了一个无限回调循环:,on => :创建.但是,只有在我需要在此回调期间更新对象的属性时才会发生这种情况.有办法防止这种情况吗?我可以以某种方式强制模型重新加载自己,因此它知道它正在执行更新而不是创建吗?
class Doc < ActiveRecord::Base
  after_commit :generate,:on => :create

  ...

  def generate
    # some logic here that requires this model to be saved in the db

    self.update_attributes(:filename => filename) # Infinite loop begins here.
  end
end

解决方法

您可以使用update_column方法,该方法将跳过模型的所有回调:
self.update_column(:filename,filename)

或者你可以使用update_all方法,它遵循相同的行为

self.class.where('id = ?',self.id).update_all(:filename => filename)

最后但并非最不重要的,我个人的最爱:

self.filename = filename
self.send(:update_without_callbacks)

这个很清楚,所有回调都被忽略了,这非常有帮助

此外,作为一种不同的替代方法,如果只想在保存新记录时运行generate方法,则可以使用after_create而不是after_commit

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读