我发表了an article on disabling ActiveModel callbacks,但我不完全确定这是做这样的事情最漂亮的方法。
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_callback
后跟set_callback
再次设置删除的回调是个坏主意吗?你会怎么做? :)
答案 0 :(得分:1)
您可以在使用发送保存回调和验证之前跳过,例如
user = User.new(:name=>'test')
user.send(:create_without_callbacks)
答案 1 :(得分:1)
这个怎么样?
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
答案 2 :(得分:0)
您当前的解决方案似乎“危险”,因为如果更新引发异常,则回调不会被放回原位,这可能会严重破坏其后的任何请求。自修改代码是一个非常糟糕的主意,如果它可以对其他线程有持久的副作用,它有点像使用全局变量。
但我似乎有问题而且我一直在四处寻找解决方案,而你的解决方案一直是我能找到的最好的解决方案。我认为Rails可能需要为Callback模块添加更优雅的方法。