2013-04-16 6 views
0

Я создаю приложение поверх устаревшей базы данных SQL Enterprise с существующей схемой, но я также хочу поддерживать PostgreSQL с аналогичной, но более обычной схемой ActiveRecord. У меня есть набор классов ActiveRecord для каждой базы данных, которые абстрагируют различия схем и представляют собой общий интерфейс для представлений и контроллеров. Я хотел бы иметь возможность переключать набор классов, используемых на уровне приложений, в соответствии с окружением/config.Интерфейс Ruby для абстрагирования устаревшей базы данных

На любом другом языке у меня будет фабрика объектов, которая создает объекты, используя соответствующие классы для среды. Но я понимаю, что такие шаблоны являются излишними для рубина.

Если у меня есть два класса, IssuePg и IssueLegacy, есть ли способ настроить мое приложение, чтобы вызов Issue.new создавал экземпляр соответствующей модели? Я знаю, что я могу назначить класс переменной, но где бы я это сделал, чтобы она была системной и невидимой для Rails и совместима со строительными лесами, поэтому я мог бы эскалайтировать вокруг проблемы, а затем изменить класс суперкласса в соответствии со средой?

Мне также нужен отдельный набор миграций для каждой среды - любые мысли? Или это проблема контроля источника?

ответ

0

Один heavyhanded, как вы могли бы сделать это, чтобы использовать переменную окружения строки или команды, а затем сделать что-то вроде:

if Rails.env['db_support'] == :legacy 
    require '/path/to/legacy/ar/objects' 
else 
    require '/path/to/normal/ar/objects' 
end 

Это сегрегирует ваши модели и держит CodeBase немного чище.

+0

Я полагаю, это может быть так просто. Я теряюсь во всех возможных вариантах рубиновых подарков. –

Смежные вопросы