模型
class Line < ActiveRecord::Base
attr_accessible :num, :foreign_id
def self.cached_foreign(q)
Rails.cache.fetch([name,"foreign"+q.to_s]) { where(:foreign_id => q) }
end
end
对于上面的模型,当重复运行Line.cached_foreign(1)
时,它总是执行sql语句。
这里有什么问题?理想情况下,它应该从缓存中返回重复的调用。
使用find
时似乎工作正常,但使用where
时却没有。
答案 0 :(得分:1)
它适用于:
where(foreign_id: q).all
这是因为没有.all
的语句被懒惰地评估,所以在你的缓存中存储代理对象,它在真正需要时进行评估。如果添加.all
,则会在缓存中存储实际的记录集。