具有前/后过滤器和观察者的Rails模型是否可以忽略这些钩子?

时间:2011-07-01 02:54:47

标签: ruby-on-rails ruby

如果模型在钩子之前/之后,可能还有一些其他事件的观察者,是否有可能以某种方式仅在模型上执行保存/更新操作并跳过将要触发的任何/所有这些钩子?

e.g。我执行保存,并以某种方式告诉我的模型忽略任何after_save事件,并且不通知观察者这个保存,因为我不希望它发射任何它通常做的。

2 个答案:

答案 0 :(得分:3)

您可以使用skip_callback方法不执行回调。例如:

User.skip_callback(“create”,:after,:send_confirmation_email)将跳过在after_create上配置名称为send_confirmation_email的回调。

您可以通过以下方式设置相同的内容: User.set_callback(“create”,:after,:send_confirmation_email)

答案 1 :(得分:3)

我使用update_all来满足这些要求。

# update the name and price of product with id 23
Product.update_all({:name => "foo bar", :price => 25}, {:id => 23})

我之前也使用过这种技术:

product.name = "foo"
product.description = "bar"
changes = product.changes.inject({}){|h, v| h[v[0]]=v[1][1];h}
Product.update_all(changes, :id => product)
product.reload # for good measure..

在这里,您以正常方式操作对象,当您准备好更新对象时,您将提取已更改的属性。这消除了对列进行硬编码以进行更新的需要。