ActiveRecord:缓存并自动更新(冗余)属性 - 最佳实践

时间:2009-08-18 10:37:29

标签: ruby-on-rails activerecord

鉴于以下ActiveRecord模型:

class Tree < ActiveRecord::Base
  # attributes: title, price, some_date
  has_many :nodes
end

class Node < ActiveRecord::Base
  # attributes: title, price, some_date
  belongs_to :tree
end

树有许多节点(1'000 - 2'000)。 出于性能和其他原因,我想在Node实例中缓存price属性。节点应始终具有与其关联树相同的价格。这将使计算和查询更容易,更快。

有关于如何做到这一点的最佳做法吗?也许连插件?

到目前为止我所得到的是:

class Tree
  after_save do; nodes.each{|n| n.update_attribute :price, price} if price_changed?; end
end

由于我需要许多这样的缓存属性,这可能会变得有点麻烦。

1 个答案:

答案 0 :(得分:2)

您的解决方案的问题似乎是它将为每个节点执行UPDATE语句。通过跨树的所有节点使用单个UPDATE SQL语句,可以提高效率。

在Rails中,这可以通过

完成
class Tree
  after_save do; nodes.update_all("price = #{price}") if price_changed?; end
end

请参阅:http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002273

注意:此方法的缺点是它不会在节点上触发ActiveRecord回调。