Наследование с единой таблицей (Single Table Inheritance) - Разработка модуля для хранения и управления документами в электронном виде

Документы должны иметь различные типы, которые определяют логику их поведения. Должна быть возможность создать новый тип документа и определить его логику. Но создание нового типа не должно создавать новую таблицу: программисту необходимо лишь добавить класс-наследник абстрактного документа. Здесь появляется проблема, связанная с ORM: как отобразить на реляционной базе данных отношение наследования классов в ООП?

Для решения это проблемы обычно используется паттерн проектирования STI (Single Table Inheritance). Основной смысл заключается в добавлении к таблице БД строкового поля type, в котором хранится название класса. При получении записи будет создаваться объект класса, указанного в поле type. Ruby on Rails поддерживает данную технологию.

Реализация STI в разрабатываемом приложении сводится к внесению в миграцию создания таблицы documents строкового поля "type" и наследованию конкретных классов документов (например, Passport) от суперкласса Document (который и связан с таблицей documents).

Ниже проиллюстрирован пример работы STI.

    1) Создается подкласс: 2) class Passport < document 3) # помещается любая специфичная логика 4) end 5) создается объект конкретного класса 6) passport = passport. new 7) объект сохраняется 8) passport. save

В базе данных в таблице documents при этом создается запись следующего вида:

Id

Type

1

Passport

Если требуется получить документ с id = 1, выполняется командаdoc = Document. find(1)

Rails анализирует поле type таблицы и помещает в переменную doc объект типа Passport.

Похожие статьи




Наследование с единой таблицей (Single Table Inheritance) - Разработка модуля для хранения и управления документами в электронном виде

Предыдущая | Следующая