Как я могу получить YAML :: load для вызова const_missing? - PullRequest
0 голосов
/ 22 ноября 2010

Я сериализую объект в поле базы данных, используя функцию 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

1 Ответ

0 голосов
/ 23 ноября 2010

Из моего опыта YAML::load возвращает хэш. Я должен пройти через хэш и что-то сделать с его содержимым. Ни load, ни load_file не принимают блок, чтобы попасть внутрь них и влиять на то, как анализируется документ YAML.

Вы можете попробовать поиграться с load_documents или each_document, потому что они занимают блок, но я не знаю, можете ли вы таким образом добавить дополнительные элементы хеша .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...