ruby-on-rails - 如何在 Rails 中缓存计算列?

标签 ruby-on-rails ruby calculated-columns caching

我有一棵事件记录对象树,类似于:

class Part < ActiveRecord::Base
  has_many :sub_parts, :class_name => "Part"

  def complicated_calculation
    if sub_parts.size > 0
      return self.sub_parts.inject(0){ |sum, current| sum + current.complicated_calculation }
    else
      sleep(1)
      return rand(10000)
    end
  end

end

每次都重新计算complicated_calculation,代价太大。所以,我需要一种方法来缓存值。但是,如果任何部分发生变化,则需要使它的缓存以及它的父、祖父等的缓存失效。

作为草稿,我创建了一个列来保存“部分”表中的缓存计算,但这闻起来有点腐烂。似乎应该有一种更简洁的方法来缓存计算值,而不会将它们与“真实”列一起填充。

最佳答案

我建议使用关联回调。

class Part < ActiveRecord::Base
  has_many :sub_parts,
    :class_name => "Part",
    :after_add => :count_sub_parts,
    :after_remove => :count_sub_parts

  private

  def count_sub_parts
    update_attribute(:sub_part_count, calculate_sub_part_count)
  end

  def calculate_sub_part_count
    # perform the actual calculation here
  end
end

很好很简单 =)

关于ruby-on-rails - 如何在 Rails 中缓存计算列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/181090/

相关文章:

sql - postgres 更改表并插入行概率

ruby-on-rails - PG运算符不存在 : uuid = text

ruby-on-rails - 如何使用 pg_search 搜索对象的虚拟属性?

javascript - rails partials 中的内联 Javascript

ruby - 如何使用 slim 的模板语言在段落中间放置超链接?

MySql 移动差异?

MySQL:在where子句中使用字段内容

ruby-on-rails - Ruby on Rails - 如何以彩色打印日志消息

ruby-on-rails - 在Rails中,如何去除由 '/'(URL)分隔的字符串的前两个部分?

构建 Qpid 时的 RUBY_LIBRARY cmake 变量