我的问题类似于这个问题How to skip ActiveRecord callbacks?但是我使用Mongoid而不是AR,似乎尚未在当前版本的Mongoid中实现,所以我想知道应该怎么做是一个优雅的解决方案来实现它。 (如有必要)。
答案 0 :(得分:30)
是的,你可以!
Mongoid构建于ActiveModel上,ActiveModel具有skip_callback function。您可以像这样使用skip_callback
:
# skip the callback
MyModelClass.skip_callback(:save, :before, :ensure_foo_is_not_bar)
my_model_instance.update_attributes :foo => 'bar'
# restore the callback for future calls
MyModelClass.set_callback(:save, :before, :ensure_foo_is_not_bar)
我在一个大应用程序中毫不费力地使用它。有关详细信息,请参阅Jeff Kreeftmeijer撰写的此博客文章:
http://jeffkreeftmeijer.com/2010/disabling-activemodel-callbacks/
答案 1 :(得分:18)
使用Mongoid原子操作(set,unset等)可能更容易:
http://mongoid.org/en/mongoid/docs/persistence.html#atomic
这些不会引发回调。
编辑:Mongoid 3表示他们不会发起回调。我看到他们在Mongoid 2中进行了回击。所以YMMV
答案 2 :(得分:11)
我最终使用了Brian Armstrong的建议,只是打电话给
person.set(name:"Robert Pulson")
在我的保存后回调中。
答案 3 :(得分:3)
如果您想在不对大量项目触发所有回调的情况下进行更新,通常会出现这种情况。这可以通过降序到驱动程序来完成:
在'x'字段中用'bar'替换'foo'。
User.all.each do |u|
User.collection.where({ _id: u.id }).update({
"$set" => { :x => u.x.gsub('foo', 'bar')
})
end
答案 4 :(得分:1)
我搜索代码。并且没有办法避免Mongoid中的回调。在版本1.9和2.0中。
您需要针对此提出补丁或功能请求。