Rails.cache.fetch исключение: TypeError (<ModelName> нельзя ссылаться) - PullRequest
9 голосов
/ 05 октября 2011

Я реализую некоторое кэширование, используя отличную Rails.cache.fetch.Тем не менее, в одном конкретном случае иногда я сталкиваюсь с исключением:

TypeError in EmloController#index

Emlo can't be referred to

app/controllers/emlo_controller.rb:320:in `get_employees'
app/controllers/emlo_controller.rb:356:in `prepare_json_response'
app/controllers/emlo_controller.rb:23:in `block (2 levels) in index'
app/controllers/emlo_controller.rb:15:in `index'

Кажется, что выборка всегда будет взорваться (с учетом вышеизложенного) с первой попытки, а затем будет работать нормально, пока выборка находится в пределахистечение срока.Я знаю, что что-то упустил, так что свежая пара глаз была бы хороша.

Вот метод, который вызывает выборку из кэша:

def get_employees

  # This is for a AJAX refresh loop, so a 5-second cache actually helps quite a bit
  Rails.cache.fetch('emlo_all', :expires_in => 5.seconds, :race_condition_ttl => 1) do

    conditions = (params[:id]) ? {:user_id => params[:id]} : nil

    selections = [
      'employee_locations.id AS emlo_id',
      'employee_locations.status_id',
      'employee_locations.notes',
      'employee_locations.until',
      'employee_locations.updated_at',
      'employee_locations.user_id',
      'location_states.id AS state_id',
      'location_states.title AS status_string',
      'location_states.font_color',
      'location_states.bg_color',
      'users.displayname',
      'users.email',
      'users.mobile',
      'users.department',
      'users.extension',
      'users.guid',
      'users.dn'
    ].join(', ')

    Emlo.all(
        :select => selections,
        :joins => 'LEFT JOIN users ON employee_locations.user_id=users.id LEFT JOIN location_states ON employee_locations.status_id=location_states.id',
        :conditions => conditions,
        :order => 'users.displayname ASC'
    )
  end
end

Ответы [ 2 ]

15 голосов
/ 20 октября 2011

Эта проблема возникает в режиме разработки, когда config.action_controller.perform_caching = true И config.cache_classes = false - кажется, что объекты ActiveRecord не могут быть сохранены с Rails.cache.

Но если вам нужно включить config.action_controller.perform_caching в режиме разработки для тестирования кэширования, то вы также должны включить config.cache_classes. Однако это будет временно, потому что тогда вам придется перезапустить сервер разработки после изменения классов или файлов в конвейере ресурсов.

Если кэширование отключено, я бы использовал Rails.cache.write(some_name, some_value) if Rails.env.production?, чтобы предотвратить взрыв в процессе разработки. Rails.cache.read() похоже не затронут.

0 голосов
/ 30 марта 2012

В зависимости от структуры вашего приложения, вы можете получить ошибку в разработке, например: TypeError (Пользователь не может быть передан) Эта ошибка вызвана каким-то безумием, связанным с перезагрузкой кэширования: промежуточное программное обеспечение, имплантированное каким-либо гемом, кэшируется. Но в процессе разработки ваши занятия обычно не проходят. Таким образом, некоторые классы могут быть недоступны при определенных обстоятельствах, например, если вы используете фильтры до проверки подлинности пользователя, предоставляемые каким-либо механизмом. Вы должны быть в состоянии избавиться от вышеуказанной ошибки, включив кэширование классов. Попробуйте (и перезапустите сервер после этого):

development.rb

config.cache_classes = true

Если ошибка исчезла, вам повезло. Но поскольку кеширование классов в процессе разработки не представляется возможным, снова отключите кеширование классов и явно потребуйте класс, на который нельзя ссылаться. I.E.:

вершина разработки.rb

require 'app / models / user'

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