Rails 3缓存转储错误



我使用Rails 3.0.5和Ruby 1.9.2作为应用程序。在我的开发模式下,我已经配置了缓存。

  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是玩家模型的一个类方法,它返回一个玩家数组作为数据库查询的结果。它只是一个普通的旧数组。

似乎是什么错误…我尝试了几种方法来分析这个问题,但都不起作用。请帮助

缓存使用标准封送来缓存对象。你要序列化的对象中有一个互斥对象但是你不能序列化比运行时状态稍微多一点的东西

有些对象不能被转储:如果要转储的对象包括绑定、过程或方法对象、类IO的实例或单例对象,将引发TypeError。

问题是有些东西只作为运行时信息存在,它们不能自动重新创建。

你有一个线程互斥锁在你的播放器和元帅没有办法自动序列化互斥锁。你必须实现你自己的序列化;Marshal文档中列出了两种方法:

  • 实现marshal_dumpmarshal_load方法
  • 实现_dump_load方法

你可能会想用marshal_dumpmarshal_load,因为它们是最简单的。

确定这是一个数组,而不是一个ActiveRecord关系?我有过这个错误,它只有在我把它转换成数组后才会消失。因此,我的代码

Model.joined_model.where(blah) 

必须变成

Model.joined_model.where(blah).to_a

然后它就跑了!

相关内容

  • 没有找到相关文章

最新更新