如何跳过Mongoid文档的回调?

时间:2010-06-15 16:07:36

标签: ruby-on-rails ruby activerecord mongoid

我的问题类似于这个问题How to skip ActiveRecord callbacks?但是我使用Mongoid而不是AR,似乎尚未在当前版本的Mongoid中实现,所以我想知道应该怎么做是一个优雅的解决方案来实现它。 (如有必要)。

5 个答案:

答案 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中。

您需要针对此提出补丁或功能请求。