在 Rails 中保存模型时,我需要计算值。所以我打电话calculate_averages
作为 Survey
的回调类(class):
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
被调用并做它的事情。问题是,首先,即使您没有对记录进行任何更改,是否也可以强制调用回调?其次,平均值的计算方式是 远更有效的是根本不让回调被调用,并一次性计算所有内容的平均值。这有可能不让回调被调用吗?
最佳答案
我相信您的要求可以通过 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
.
关于ruby-on-rails - 如何在不运行 Rails 回调的情况下保存模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21371734/