开发者

How can I get YAML::load to call const_missing?

开发者 https://www.devze.com 2023-01-26 22:55 出处:网络
I am serializing an object to a database field using ActiveRecord\'s :serialize functionality in Ruby on Rails

I am serializing an object to a database field using ActiveRecord's :serialize functionality in Ruby on Rails

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

end

The reason I'm serializing the objects is that I'm dynamically loading the types from disk using const_missing, so I don't have to set开发者_运维问答up database tables for them.

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

So when I want to add a draw element, I do something like this in irb

draw_element.content = DrawElement::Text.new

Everything here works fine

The problem is that when I try to load the object from the database in a fresh session, YAML::load never calls const_missing to require the class definition before loading the file. So all my @content objects come back as YAML::Object

Is there a better way to do this? I'm trying to be able to add new types without having to change the database, or have a has_many_polymorph relationship between DrawElements and a Document.

Ruby on Rails v.2.3.8, Ruby v. 1.8.7


From my experience YAML::load returns a hash. It's up to me to walk through the hash and do something with its contents. Neither load or load_file accept a block to get inside them and influence how the YAML document is parsed.

You could try messing with load_documents or each_document though, because they take a block, but I don't know if you could add additional hash elements that way.

0

精彩评论

暂无评论...
验证码 换一张
取 消