我遇到了memcached的问题。
我在这里使用Gregg Pollack的例子http://railslab.newrelic.com/2009/02/19/episode-8-memcached
post.rb
def self.recent
Rails.cache.fetch('recent_posts', :expires_in => 15.minutes) do
self.order('id DESC').limit(15)
end
end
在我的控制器中,我用@posts = Post.recent
调用它并将其写入缓存。如果我重新加载页面,我会收到错误TypeError: can't modify frozen object
。
我在控制台中尝试了相同的操作,但我得到了同样的错误。第一次执行@posts = Post.recent
时,密钥recent_posts被添加到缓存中。当我第二次执行相同的命令时,我得到了冻结的错误。
我正在使用Rails 3.0.1并在开发模式下工作。
我在这里做错了吗?
谢谢!
添
答案 0 :(得分:7)
您正在缓存排序选项,而不是任何实际结果。当您执行查询时,Rails将修改您的查询选项,这将无效,因为缓存中的某些内容被视为不可变。
试试这个:
def self.recent
Rails.cache.fetch('recent_posts', :expires_in => 15.minutes) do
self.order("id DESC").limit(15).all
end
end
现在您将存储一系列帖子,以后可以使用。
答案 1 :(得分:2)
请注意,如果您在Rails 3中执行此操作,因为Rails现在延迟加载,则使用arel来获取记录。因此,您所存储的所有内容在技术上都是一种活跃的记录关系。
所以你需要先解决这个问题,然后在memlached中存储一个arel上的.to_a方法。这将使它在存储对象之前成为一个数组。
即。 @posts = Post.recent.to_a
希望这有助于某人。