Rails缓存where子句

时间:2013-07-05 09:27:49

标签: ruby-on-rails caching

模型

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时却没有。

1 个答案:

答案 0 :(得分:1)

它适用于:

where(foreign_id: q).all

这是因为没有.all的语句被懒惰地评估,所以在你的缓存中存储代理对象,它在真正需要时进行评估。如果添加.all,则会在缓存中存储实际的记录集。