Проблемы с доступом к атрибутам объекта из кеша - PullRequest
1 голос
/ 13 апреля 2011

Я кэширую несколько объектов User, используя Rails.cache.write, но когда я извлекаю его из кэша и пытаюсь вызвать метод атрибута (идентификатор, имя, адрес электронной почты и т. Д.) Для любого объекта User, который я получаю

You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.include? 

Я могу вызвать inspect для объектов User и увидеть все атрибуты. Есть идеи? Спасибо

Я использую стандартную конфигурацию кеша, без изменений. Вот некоторый код:

Я пишу в кеш в моей модели внутри экземпляра метода, который вызывается, когда пользователь входит в систему следующим образом:

cached_friends = self.friends
Rails.cache.write(self.id.to_s+"_friends", cached_friends)

Тогда в моем контроллере у меня есть фильтр before:

def get_friends_from_cache
  if current_user
    friends = Rails.cache.read(current_user.id.to_s+"_friends")
    friends.each do |friend|
      if !friend.facebook_id.nil?
        #other stuff....
      end
    end
  end
end

Я получаю ошибку в строке if !friend.facebook_id.nil?. facebook_id - это столбец в БД. По существу нет методов экземпляра пользователя, доступных для каждого объекта пользователя. Но я знаю, что объекты есть, потому что я могу вставить raise "#{friends.first.inspect}", и все выплевывается, как я и ожидал.

1 Ответ

1 голос
/ 26 января 2012

Это происходит в режиме разработки (т. Е. С настройкой config.cache_classes = false).Основная причина:

  1. ActiveRecord извлекает методы доступа к атрибутам из объектов класса
  2. MemoryStore (т. Е. Хранилище кэша по умолчанию) не использует боевые / нематериальные объекты

Один из способов - использовать MemCacheStore, другой - установить config.cache_classes = true.Смотрите также Комментарии к рейсу

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