Получение ошибки Невозможно изменить замороженный объект при использовании memcached в Rails - PullRequest
0 голосов
/ 03 декабря 2010

У меня проблема с memcached.

Я использую пример Грегга Поллака здесь 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 ключ недавние_посты добавляются в кэш.Когда я выполняю ту же команду во второй раз, я получаю замороженную ошибку.

Я использую Rails 3.0.1 и работаю в режиме разработки.

Я что-то здесь не так делаю?

Спасибо!

Тим

Ответы [ 2 ]

7 голосов
/ 03 декабря 2010

Вы кэшируете параметры сортировки, а не фактические результаты.Когда вы выполняете запрос, Rails изменяет параметры запроса, которые не будут работать, потому что что-то из кэша считается неизменным.

Попробуйте это:

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

Теперь вы будете хранить массив сообщений, которые вы сможете использовать позже.

2 голосов
/ 08 мая 2011

Обратите внимание, что если вы делаете это в Rails 3, то, поскольку Rails теперь загружается лениво, arel используется для извлечения записей.Таким образом, все, что вы храните, это технически активное отношение записи.

Таким образом, вам нужно решить эту проблему, прежде чем сохранять в memcached а-ля метод .to_a на arel.Это сделает его массивом перед сохранением объекта.

т.е. @posts = Post.recent.to_a

Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...