ruby-on-rails - 如何在不运行 Rails 回调的情况下保存模型

标签 ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.2 rails-activerecord

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

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

set_callback :save, :before, :my_before_save_callback

跳过 before_save回调,你会这样做:
Survey.skip_callback(:save, :before, :calculate_average). 

请引用链接 ActiveSupport::Callbacks 其他支持的选项,如条件和块到 set_callbackskip_callback .

关于ruby-on-rails - 如何在不运行 Rails 回调的情况下保存模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21371734/

相关文章:

ruby-on-rails-3 - Rails 3 和设计。杀死当前 session

ruby-on-rails - 是否可以将 'activerecord-import' gem 用于 Rails 中的无模型表?

ruby-on-rails - 如何将 1 个月添加到 DateTime 变量?

ruby-on-rails - Rails will_paginate 错误 : undefined method `total_pages'

ruby-on-rails - Ruby/Rails 解析电子邮件

ruby-on-rails - Activerecord 返回匹配数组中所有属性的对象

ruby-on-rails - activerecord-2.3.14 与 ruby​​ 1.9.2::undefined 方法 `reject' 中断 "4":String

ruby-on-rails - structure.sql 文件中的 search_path 被 rails db :migrate 修改

ruby-on-rails - Rails 4 - 提交后重定向到正确的网址

ruby-on-rails - Ruby on Rails content_for 会自动进行 HTML 转义吗?