How can I get YAML::load to call const_missing?
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.
精彩评论