Rails 3缓存转储错误

时间:2011-04-22 06:39:58

标签: ruby-on-rails ruby ruby-on-rails-3

我将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模型的类方法,它通过db查询返回一个玩家数组。它只是一个普通的旧阵列。

什么似乎是错误..我已经尝试了几种方法来分析这个,但没有一个工作。请帮忙

2 个答案:

答案 0 :(得分:6)

缓存使用标准marshalling来缓存您的对象。您尝试序列化的其中一个对象中有一个Mutex,但您无法序列化只是运行时状态的内容:

  

无法转储某些对象:如果要转储的对象包括绑定,过程或方法对象,类IO实例或单例对象,则会引发TypeError。

问题在于某些内容仅作为运行时信息存在,无法自动重新创建。

你的播放器中某处有一个线程互斥,而且Marshal无法自动序列化互斥锁。你将不得不实现自己的序列化;在Marshal文档中列出了两种执行此操作的方法:

  • 实施marshal_dumpmarshal_load方法。
  • 实施_dump_load方法。

您可能希望选择marshal_dumpmarshal_load,因为它们最简单。

答案 1 :(得分:2)

确定它是一个数组,而不是ActiveRecord关系?我有这个错误,它只是在我将它转换为数组后消失了。所以,我的代码

Model.joined_model.where(blah) 

必须成为

Model.joined_model.where(blah).to_a

然后就走了!