Ruby 在带有mongo_映射器的嵌入文档上的Marshal.dump不起作用

Ruby 在带有mongo_映射器的嵌入文档上的Marshal.dump不起作用,ruby,mongomapper,Ruby,Mongomapper,我无意中发现了一个问题:如何编组包含嵌入式文档的MongoMapper::文档。以下是脚本: # gem install mongo_mapper -v 0.13.0beta2 require 'active_support' require 'mongo_mapper' MongoMapper.database = "mmt" class Foo include MongoMapper::Document key :msg, String one :bar end cla

我无意中发现了一个问题:如何编组包含嵌入式文档的MongoMapper::文档。以下是脚本:

# gem install mongo_mapper -v 0.13.0beta2
require 'active_support'
require 'mongo_mapper'

MongoMapper.database = "mmt"

class Foo 
  include MongoMapper::Document
  key :msg, String
  one :bar 
end

class Bar 
  include MongoMapper::EmbeddedDocument
  key :msg, String
end

Foo.delete_all

f = Foo.new(:msg => "first foo")
f.save!

puts "-- dump && load without bar"
foo = Foo.first()
foo_data = Marshal.dump(foo)
new_foo = Marshal.load(foo_data)
puts "foo == new_foo: #{foo == new_foo}"

puts "-- Adding Bar"
foo.bar = Bar.new(:msg => "i'm a bar")

foo_bar_data = Marshal.dump(foo)
new_foo_bar = Marshal.load(foo_bar_data)
puts "foo == new_foo_bar: #{foo == new_foo_bar}"
它因错误而崩溃

-- dump && load without bar
foo == new_foo: true
-- Adding Bar
mongo_marshal_test.rb:35:in `dump': no _dump_data is defined for class Proc (TypeError)
    from mongo_marshal_test.rb:35:in `<main>'
--无栏转储和加载(&L)
foo==new\u foo:true
--添加条
mongo_marshal_test.rb:35:在'dump'中:没有为类Proc定义任何转储数据(TypeError)
来自mongo_marshal_测试。rb:35:in`'
只要没有嵌入条,文件foo的卸载和加载工作就可以进行。有人能告诉我为什么会这样吗

很明显,这是酒吧的特色。但是我找不到关于Marshal.dump如何在内部工作的提示,所以我被卡住了

我使用的是ruby-2.0.0-p247,mongo_映射器0.13.0.beta2,bson_ext 1.9.2


谢谢大家…

(1)在您的模型的MongoMapper中可能有一个
默认\u proc
或类似的东西。(2)
Marshal
对于持久性数据来说不是一种好的格式,因为当您的Ruby版本发生变化时,格式可能会发生变化,并且在较新的Ruby中没有明智的方法读取旧的封送转储。正确地嵌入文档或将其序列化为JSON,并使用散列字段进行存储或类似操作,可能会让您的运气更好。您好,您说得对。我不想通过dump()将其持久化。我在将对象放入(rails)会话后得到了这个结果。所以ruby版本不是主要的问题。会话在你背后使用封送。您通常只将ID放入会话中,否则您将拥有同一数据的多个副本,并且它们可能会失去同步。您好,您说得对。我在那个地方有一种奇怪的设计。但我还是想知道为什么它不起作用。隐藏的默认进程是一个很好的提示…到处都是
default\u proc
s。您可以编写封送处理的粘合方法,有关详细信息,请参阅文档()。我仍然认为你应该重新考虑你的整个“将整个MM对象放入会话”策略。