Rails Multi Table Inheritance, Полиморфная ассоциация или Single Table Inheritance?
Я пытаюсь реализовать эталонную модель OpenEHR в Rails (ActiveRecord), но я нахожу некоторые проблемы, так как она работает с множеством различных классов,
Вот схема Композиции:
Как видите, многие классы "наследуют" пару атрибутов от Locatable
или же Pathable
* (вся ссылка огромна, и почти каждый класс наследуется от нее).
Кроме того, он устанавливает data_types как другие классы, например, в том же классе композиции, language
это класс CODE_PHRASE
, которые имеют два атрибута ( ссылка).
Поэтому я сталкиваюсь с двумя проблемами: 1) как я могу наследовать атрибуты от абстрактных классов, и 2) как я могу "включать" нужные "классы".
Для первой проблемы я подумал об использовании полиморфных ассоциаций.
Во-вторых, я подумал об использовании STI, но я быстро нахожу много почти похожих моделей (на самом деле они абсолютно одинаковые): CompositionLanguage
, CompositionTerritory
, EntrySetting
, EntryEncoding
что я использую только в type
например, атрибут "обратная связь": класс композиции может иметь до трех атрибутов с CODE_PHRASE
поскольку все три ссылаются на разные атрибуты (язык, территорию и категорию), я подумал, что мне нужно знать об ассоциациях (нет смысла знать, что в Composition есть 3 code_phrases, но я не знал, какой из них является соответствующим атрибутом). С другой стороны, Entry
класс, есть setting
а также encoding
атрибут ( ссылка).
Я понимаю, что могут быть разные подходы, но я действительно хотел бы знать, не было ли это возможно для Rails (или ActiveRecord). Или, может быть, мне не хватает концептуальной информации.
2 ответа
Спецификация openEHR RM имеет глубоко вложенное наследование и составные шаблоны с древовидной иерархией.
Я не мог реализовать это вложенное наследование ActiveRecord. Следующая реализация является примером для моделирования openEHR RM. Я был бы очень рад, если бы этот пример мог вам помочь.
Вы смотрели на этот проект.. https://github.com/skoba/openehr-rails
Я думаю, что Синдзи использует Active Record.
Лично, учитывая сложную структуру openEHR RM, если бы я начинал, я мог бы использовать что-то вроде MongoDB с ORM.
Я указал техническому сообществу openehr на ваш вопрос в техническом списке openehr, чтобы узнать, могут ли помочь другие.
Ян