鉴于以下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
由于我需要许多这样的缓存属性,这可能会变得有点麻烦。
答案 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回调。