2011-07-01 18 views
1

如果一個模型在鉤子之前/之後,並且可能有其他事件的一些觀察者,有可能以某種方式只對模型執行保存/更新操作並跳過將會觸發的所有這些鉤子?過濾器和觀察者之前/之後的Rails模型,是否可以忽略這些鉤子?

例如我執行保存,並以某種方式告訴我的模型忽略任何after_save事件,並且不通知觀察者這個保存,因爲我不想讓它觸發它通常所做的任何事情。

回答

3

您可以使用skip_callback方法不執行回調。對於如:

User.skip_callback( 「創造」,:後:send_confirmation_email)將跳過與上after_create配置的名稱send_confirmation_email回調。

您可以設定同退:User.set_callback( 「創造」,:後:send_confirmation_email)

+0

這是線程安全嗎? –

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.. 

在這裏,你是在對象上以正常方式運行,當你準備更新對象您提取更改後的屬性。這消除了對要更新的列進行硬編碼的需要。

+0

用更多方法更新了答案。 –

+0

'update_all'是我祈禱的答案。我正在用'before_save'計算實時統計數據,這真是一場噩夢。 – Dex

相關問題