Ruby on rails 禁用ActiveModel回调
我出版了,但我不完全确定这是做这种事情最漂亮的方式Ruby on rails 禁用ActiveModel回调,ruby-on-rails,ruby,callback,activemodel,Ruby On Rails,Ruby,Callback,Activemodel,我出版了,但我不完全确定这是做这种事情最漂亮的方式 Mongoid::Timestamps添加保存前回调,用于更新updated_at字段。假设在某些情况下我不希望出现这种情况,我禁用回调,如下所示: class User # I'm using Mongoid, but this should work for anything based on # ActiveModel. include Mongoid::Document include Mongoid::Timesta
Mongoid::Timestamps
添加保存前回调,用于更新updated_at
字段。假设在某些情况下我不希望出现这种情况,我禁用回调,如下所示:
class User
# I'm using Mongoid, but this should work for anything based on
# ActiveModel.
include Mongoid::Document
include Mongoid::Timestamps
def sneaky_update(attributes)
User.skip_callback(:save, :before, :set_updated_at)
User.update_attributes(attributes)
User.set_callback(:save, :before, :set_updated_at)
end
end
调用
skip\u callback
,然后调用set\u callback
,以再次设置已删除的回调是否是一个坏主意?你会怎么做?:) 例如,您可以使用send在保存回调和验证之前跳过
user = User.new(:name=>'test')
user.send(:create_without_callbacks)
这个怎么样
module Mongoid
module Timestamps
attr_accessor :skip_updated_at
def set_updated_at_new
unless self.skip_updated_at
set_updated_at_org
end
end
alias set_updated_at_org set_updated_at
alias set_updated_at set_updated_at_new
end
end
class User
# I'm using Mongoid, but this should work for anything based on
# ActiveModel.
include Mongoid::Document
include Mongoid::Timestamps
def sneaky_update(attributes)
self.skip_updated_at = true
User.update_attributes(attributes)
self.skip_updated_at = false
end
end
您当前的解决方案似乎是“危险的”,因为如果更新引发异常,那么回调就不会被放回原位,这可能会严重破坏它之后的任何请求。自我修改代码是一个非常糟糕的主意,如果它对其他线程有持久的副作用,这有点像使用全局函数
但我似乎有问题,我一直在四处寻找解决方案,而你的解决方案是迄今为止我能找到的最好的。我认为Rails可能需要为回调模块添加一种更优雅的方法。您能更具体地回答您的问题吗?Stackoverflow并不是真的为博客中心提供反馈。对不起,我补充了我的问题描述。我不是想征求关于博客文章的反馈,而是想征求关于我所写但不确定的解决方案的反馈。:)你能给我看一下
:创建没有回调的\u吗?我怀疑这就是魔法发生的地方。:)我的理解是,这将调用基类上的私有方法。这是一个解决方案,但我更喜欢禁用回调,而不是更改它调用的方法。:)