@fuCtor
Ruby разработчик

Возможно ли как-либо организовать полиморфизм в ActiveRecord без поля type?

Собственно стоит задача натянуть на давно существующую базу (структуру которой сильно желательно не менять) приложение на RoR. Но в данной базе есть сущности, с которыми хорошо было бы работать через STI. Тут возникает проблема, т.к. для определения класса, который должен быть создан, требуется поле type, но в классическом виде использовать не получается. Однако в таблице есть поле type_id, указывающее на таблицу-справочник типов. Собственно возможно ли как-нибудь реализовать создание нужных классов через данное поле/таблицу?



PCt2xDFqE4y5UzKAJSQ.jpg
  • Вопрос задан
  • 2776 просмотров
Решения вопроса 1
@fuCtor Автор вопроса
Ruby разработчик
Реализовал первый вариант (перегрузка метода), не сильно много пришлось перегружать (лишь два метода). Результат изысканий залил на github github.com/fuCtor/ext_sti
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
sl_bug
@sl_bug
Самый простой костыль — смотрите код рельсов. Ищите как оно обращается к полю type. Оверрайд этого метода у себя. Ваш метод дергает ClassType и возвращает name.

Лучший способ — пишем мигрейшн который все таки делает поле type и туда заносит нужные данные. «Сильно желательно не менять» всегда можно поменять без потери функциональности.
Ответ написан
Комментировать
sdevalex
@sdevalex
Что-то типа… Если у класса нет такого свойства, то смотрим в другой таблице… если нашли — возвращаем.

class Item < ActiveRecord::Base
  belongs_to :type

  def method_missing(name, *args)
     return type.attributes[name] if type.attributes.has_key? name
     super name, args
  end
end
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы