Rails 3 Cache Dump error - PullRequest
       1

Rails 3 Cache Dump error

2 голосов
/ 22 апреля 2011

Я использую Rails 3.0.5 с Ruby 1.9.2 для приложения.В моем режиме разработки я настроил кэширование ON.

  config.action_controller.perform_caching = true
  config.cache_store = :file_store, "#{Rails.root.to_s}/tmp/cache"

И в одном из действий у меня есть эта строка кода,

@featured_players = Rails.cache.fetch("featured-players") { Player.featured(8) }

Приведенная выше строка возвращает следующую ошибку

TypeError (no marshal_dump is defined for class Mutex):
  activesupport (3.0.5) lib/active_support/cache/file_store.rb:100:in `dump'
  activesupport (3.0.5) lib/active_support/cache/file_store.rb:100:in `block in write_entry'
  activesupport (3.0.5) lib/active_support/core_ext/file/atomic.rb:20:in `atomic_write'
  activesupport (3.0.5) lib/active_support/cache/file_store.rb:100:in `write_entry'
  activesupport (3.0.5) lib/active_support/cache/strategy/local_cache.rb:135:in `write_entry'
  activesupport (3.0.5) lib/active_support/cache.rb:364:in `block in write'
  activesupport (3.0.5) lib/active_support/cache.rb:519:in `instrument'

featured - это метод класса модели Player, который возвращает массив игроков в результате запроса базы данных.Это просто старый массив.

В чем, похоже, ошибка ... Я попробовал несколько подходов, чтобы проанализировать это, но ни один из них не сработал.пожалуйста помогите

Ответы [ 2 ]

6 голосов
/ 22 апреля 2011

Кеш использует стандартный маршаллинг для кэширования ваших объектов.Один из объектов, который вы пытаетесь сериализовать, содержит Mutex , но вы не можете сериализовать что-то, что немного больше, чем просто состояние выполнения:

НекоторыеОбъекты не могут быть выгружены: если объекты, которые должны быть выгружены, включают в себя привязки, объекты процедур или методов, экземпляры класса IO или одноэлементные объекты, будет вызвано TypeError.

Проблема состоит в том, что некоторые вещи толькосуществуют как информация времени выполнения, и они не могут быть воссозданы автоматически.

Где-то в вашем проигрывателе есть мьютекс потока, и у маршала нет способа автоматически сериализовать мьютекс.Вам нужно будет реализовать свою собственную сериализацию;Есть два способа сделать это, описанные в документации Marshal :

  • Реализация marshal_dump и marshal_load методов.
  • Реализация _dump и _load методов.

Возможно, вы захотите использовать marshal_dump и marshal_load, так как они самые простые.

2 голосов
/ 30 августа 2011

Вы уверены , что это массив, а не отношение ActiveRecord? У меня была эта ошибка, и она исчезла только после того, как я преобразовал ее в массив. Итак, мой код

Model.joined_model.where(blah) 

должен был стать

Model.joined_model.where(blah).to_a

и понеслось!

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