2010-11-22 1 views
0

Je suis sérialisation d'un objet à un champ de base de données à l'aide de ActiveRecord: fonctionnalité sérialisation dans Ruby on RailsComment puis-je obtenir YAML :: load pour appeler const_missing?

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

end 

La raison pour laquelle je sérialisation des objets est que je charger dynamiquement les types de disque à l'aide const_missing, donc Je n'ai pas besoin de configurer des tables de base de données pour eux.

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 

Alors, quand je veux ajouter un élément de tirage au sort, je fais quelque chose comme ça dans irb

draw_element.content = DrawElement::Text.new 

Tout fonctionne ici bien

Le problème est que lorsque je tente de charger l'objet de la base de données dans une nouvelle session, YAML::load n'appelle jamais const_missing pour exiger la définition de classe avant de charger le fichier. Donc tous mes objets @content reviennent comme YAML::Object

Y a-t-il une meilleure façon de faire? J'essaye de pouvoir ajouter de nouveaux types sans devoir changer la base de données, ou avoir une relation has_many_polymorph entre DrawElements et un document.

Ruby on Rails v.2.3.8, Ruby v. 1.8.7

Répondre

0

De mon expérience YAML::load retourne un hachage. C'est à moi de marcher dans le hachis et de faire quelque chose avec son contenu. Ni load, ni load_file n'acceptent un bloc pour entrer à l'intérieur et influencer la façon dont le document YAML est analysé. Cependant, vous pourriez essayer de jouer avec load_documents ou each_document, parce qu'ils prennent un bloc, mais je ne sais pas si vous pouvez ajouter des éléments de hachage supplémentaires de cette façon.