【问题标题】:Getting error Can't Modify Frozen Object while using memcached in Rails在 Rails 中使用 memcached 时出现错误 Can't Modify Frozen Object
【发布时间】:2011-05-08 09:05:37
【问题描述】:

我在使用 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 并在开发模式下工作。

我在这里做错了吗?

谢谢!

提姆

【问题讨论】:

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


    【解决方案1】:

    您正在缓存排序选项,而不是任何实际结果。当您执行查询时,Rails 将修改您的查询选项,这将不起作用,因为缓存中的某些内容被认为是不可变的。

    试试这个:

    def self.recent
      Rails.cache.fetch('recent_posts', :expires_in => 15.minutes) do
        self.order("id DESC").limit(15).all
      end
    end
    

    现在您将存储一组帖子,供您以后使用。

    【讨论】:

      【解决方案2】:

      请注意,如果您在 Rails 3 中执行此操作,由于 Rails 现在延迟加载,因此使用 arel 来获取记录。因此,从技术上讲,您所存储的只是一个活动记录关系。

      因此,您需要先解决此问题,然后再将 arel 上的 .to_a 方法存储在 memcached 中。这将在存储对象之前使其成为一个数组。

      即@posts = Post.recent.to_a

      希望这对某人有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-04
        • 1970-01-01
        • 1970-01-01
        • 2018-05-09
        • 2016-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多