如何让YAML :: load调用const_missing?

时间:2010-11-22 18:46:13

标签: ruby-on-rails ruby serialization activerecord yaml

我使用ActiveRecord的序列化对象到数据库字段:Ruby on Rails中的序列化功能

class DrawElement < ActiveRecord::Base
...
    serialize :content

end

我正在序列化对象的原因是我使用const_missing从磁盘动态加载类型,所以我不必为它们设置数据库表。

def DrawElement.const_missing(const)
    require File.join('draw_elements',const.to_s)
    draw_class = const_get(const)
    return draw_class if draw_class
    raise "Draw Element not found #{const.to_s}"
end

因此,当我想添加绘图元素时,我会在irb

中执行类似的操作
draw_element.content = DrawElement::Text.new

这里的一切都很好

问题在于,当我尝试在新会话中从数据库加载对象时,YAML::load在加载文件之前从不调用const_missing来要求类定义。因此,我的所有@content个对象都会以YAML::Object

的形式返回

有更好的方法吗?我试图能够添加新类型而无需更改数据库,或者在DrawElements和Document之间建立has_many_polymorph关系。

Ruby on Rails v.2.3.8,Ruby v.1.8.7

1 个答案:

答案 0 :(得分:0)

根据我的经验YAML::load返回哈希值。由我来完成哈希并对其内容做一些事情。 loadload_file都不接受阻止进入它们并影响YAML文档的解析方式。

你可以尝试弄乱load_documentseach_document,因为它们会占用一块,但我不知道你是否可以通过这种方式添加额外的哈希元素。