ruby-on-rails - rails ,ActiveRecord : Callback run during #reload

标签 ruby-on-rails activerecord

我有一个模型,其属性是从持久列值的值生成的。

class Result < ActiveRecord::Base
  belongs_to :job
  belongs_to :customer
  has_many :records, through: :job

  def processed_records
    @processed_records ||=
      begin
        status_flagged + status_invalid +
          status_unknown + status_valid
      end
  end
end

我的问题是 Result 对象有时必须调用 #reload 才能从数据库中获取新值。有没有我可以 Hook 的回调来清除 @processed_records 的值,以便下一次调用将重新计算该值?

换句话说,我希望它能工作:

RSpec.describe Result, :type => :model do
  subject { create(:result) }

  it 'should update #processed_records on reload' do
    initial_value = subject.processed_records

    other_instance = Result.find(subject.id)
    other_instance.increment(:status_flagged)
    other_instance.save

    subject.reload
    expect(subject.processed_records).to eq(initial_value + 1)
  end
end

最佳答案

您可以覆盖模型中的 reload 方法:

def reload
  super

  # code with whatever you need to clean, for example:
  @processed_records = nil
end

关于ruby-on-rails - rails ,ActiveRecord : Callback run during #reload,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25575283/

相关文章:

ruby-on-rails-3 - Find_by_sql 和计算字段

ruby-on-rails - 以 rails activerecord 样式编写嵌套查询

mysql - 在 DATETIME 列上使用 <= 与使用 < 时的 Big SQL SELECT 性能差异

ruby-on-rails - Rails 无法加载此类文件 -- stringio (LoadError)

ruby-on-rails - scss - yml 中的 lint 排除项未被排除

ruby-on-rails - 数组中不同类的 active_model_serializers

ruby-on-rails - 如何毫无异常(exception)地选择Array Rails ActiveRecord中的ID

ruby-on-rails - Ruby on Rails 服务器已启动但无法连接到 http ://localhost:3000

ruby-on-rails - Rails 在不使用 URL 中的括号的情况下解析数组查询参数的标准方法?

ruby-on-rails - 如何替换 to_json 中的键?