Я сериализую объект в поле базы данных, используя функцию ActiveRecord: serialize в 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
Есть ли лучший способ сделать это? Я пытаюсь иметь возможность добавлять новые типы без необходимости изменять базу данных или иметь отношение has_many_polymorph
между DrawElements и документом.
Ruby on Rails v.2.3.8, Ruby v. 1.8.7