2010-12-03 27 views
0

Je rencontre un problème avec memcached.Erreur d'obtention Impossible de modifier un objet gelé lors de l'utilisation de memcached dans Rails

J'utilise l'exemple par Gregg Pollack ici 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 

Dans mon contrôleur je l'appelle avec @posts = Post.recent et il est écrit dans le cache. Si je recharge la page, j'obtiens l'erreur TypeError: can't modify frozen object.

J'ai essayé la même chose dans la console et j'ai la même erreur. La première fois que j'exécute @posts = Post.recent, la clé recent_posts est ajoutée au cache. Lorsque j'exécute la même commande la deuxième fois, j'obtiens l'erreur gelée. J'utilise Rails 3.0.1 et je travaille en mode développement. J'utilise Rails 3.0.1.

Est-ce que je fais quelque chose de mal ici?

Merci!

Tim

Répondre

7

Vous en mémoire cache des options de tri, pas de résultats réels. Lorsque vous exécutez la requête, Rails modifiera vos options de requête, ce qui ne fonctionnera pas, car quelque chose du cache est considéré comme immuable.

Essayez ceci:

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

Maintenant, vous allez stocker un tableau de messages, que vous pouvez utiliser plus tard.

+0

Cela fonctionne comme un charme. Leçon apprise. Merci! – Tim

2

Notez que si vous faites cela dans Rails 3 parce que Rails charge maintenant paresseux, arel est utilisé pour aller chercher les enregistrements. Donc tout ce que vous stockez est techniquement une relation d'enregistrement active.

Vous devez donc résoudre ce problème avant de stocker memcached dans la méthode .to_a de l'arel. Cela en fera un tableau avant de stocker l'objet.

dire @posts = Post.recent.to_a

Hope this helps quelqu'un.