在Rails中保存模型时,我需要计算值。因此,我调用calculate_averages
作为Survey
类的回调:
before_save :calculate_averages
但是,偶尔(最初我有10k条记录需要此操作),我需要手动更新每条记录的所有平均值。没问题,我有如下代码:
Survey.all.each do |survey|
survey.some_average = (survey.some_value + survey.some_other_value) / 2.to_f
#and some more averages...
survey.save!
end
在运行这段代码之前,我担心calculate_averages
会被调用并重复这段代码,甚至可能会导致我的处理方式出现一些问题。好的,然后我想,我什么也不做,让calculate_averages
被调用并做它自己的事情。问题是,首先,有没有一种方法可以强制调用回调,即使您没有对记录进行任何更改?
其次,计算平均值的方式简单地不让回调被调用并一次性计算所有东西的平均值,这是far更有效的方法。有没有可能不让回调被调用?
发布于 2014-01-27 10:02:09
我相信你所要求的可以通过ActiveSupport::Callbacks
来实现。看看set_callback
和skip_callback
吧。
为了“强制调用回调,即使你没有对记录做任何更改”,你需要将回调注册到某个事件,例如save, validate etc.
。
set_callback :save, :before, :my_before_save_callback
要跳过before_save
回调,您可以执行以下操作:
Survey.skip_callback(:save, :before, :calculate_average).
请在其他支持的选项上引用链接的ActiveSupport::Callbacks
,例如set_callback
和skip_callback
的条件和块。
发布于 2014-01-27 09:57:32
要禁用整体回调,请使用...
Survey.skip_callback(:save, :before, :calculate_averages)
然后启用它们..。
Survey.set_callback(:save, :before, :calculate_average)
这将跳过/设置所有实例。
发布于 2014-01-27 10:02:06
update_column
是一个ActiveRecord
函数,它不运行任何回调,也不运行验证。
https://stackoverflow.com/questions/21371734
复制相似问题