首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在不运行Rails回调的情况下保存模型

如何在不运行Rails回调的情况下保存模型
EN

Stack Overflow用户
提问于 2014-01-27 09:44:24
回答 8查看 49.2K关注 0票数 30

在Rails中保存模型时,我需要计算值。因此,我调用calculate_averages作为Survey类的回调:

代码语言:javascript
复制
before_save :calculate_averages

但是,偶尔(最初我有10k条记录需要此操作),我需要手动更新每条记录的所有平均值。没问题,我有如下代码:

代码语言:javascript
复制
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更有效的方法。有没有可能不让回调被调用?

EN

回答 8

Stack Overflow用户

发布于 2014-01-27 10:02:09

我相信你所要求的可以通过ActiveSupport::Callbacks来实现。看看set_callbackskip_callback吧。

为了“强制调用回调,即使你没有对记录做任何更改”,你需要将回调注册到某个事件,例如save, validate etc.

代码语言:javascript
复制
set_callback :save, :before, :my_before_save_callback

要跳过before_save回调,您可以执行以下操作:

代码语言:javascript
复制
Survey.skip_callback(:save, :before, :calculate_average). 

请在其他支持的选项上引用链接的ActiveSupport::Callbacks,例如set_callbackskip_callback的条件和块。

票数 24
EN

Stack Overflow用户

发布于 2014-01-27 09:57:32

要禁用整体回调,请使用...

代码语言:javascript
复制
Survey.skip_callback(:save, :before, :calculate_averages)

然后启用它们..。

代码语言:javascript
复制
Survey.set_callback(:save, :before, :calculate_average)

这将跳过/设置所有实例。

票数 20
EN

Stack Overflow用户

发布于 2014-01-27 10:02:06

update_column是一个ActiveRecord函数,它不运行任何回调,也不运行验证。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21371734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档