获取错误在Rails中使用memcached时无法修改冻结对象

时间:2010-12-03 03:58:31

标签: ruby-on-rails caching ruby-on-rails-3 memcached

我遇到了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并在开发模式下工作。

我在这里做错了吗?

谢谢!

2 个答案:

答案 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

希望这有助于某人。