rails STI: специальные атрибуты для подклассов

Я начинаю создавать свое первое приложение для рельсов, и у меня уже есть модель пользователя с STI (администратор, сотрудник, общественность и представитель, все они унаследованы от модели пользователя). но теперь я хочу добавить определенные столбцы (адрес, штат, телефон) для репрезентативного подкласса, но я не могу применить миграцию непосредственно для модели подкласса.

  • первое решение состоит в том, чтобы добавить эти столбцы в пользовательскую модель, но я не знаю, как ограничить доступ только к репрезентативному подклассу.
  • второе решение - создать отдельную таблицу контактов, а затем использовать полиморфную ассоциацию (я хочу связать с другой моделью) и добавить атрибуты
  • мой вопрос, что является лучшим решением для этого случая? и если есть лучшее решение?

Спасибо


person Abdelkrim Tabet Aoul    schedule 14.02.2017    source источник


Ответы (2)


Надеюсь, у тебя все хорошо

Я думаю, что второй вариант лучше, чем первый.

Причина: 1) Если все поля являются необязательными, то будет создана запись с нулевым значением, но во втором случае, если все поля являются необязательными, запись не будет создана, для этого нет необходимости в какой-либо записи.

2) В будущем потребуется добавить или использовать это поле в другой модели, тогда вы можете легко обойтись полиморфной ассоциацией.

person Mayur Shah    schedule 14.02.2017
comment
Спасибо, я буду использовать вариант полиморфной ассоциации, но я подожду когда-нибудь, если кто-то предложит другой новый вариант - person Abdelkrim Tabet Aoul; 14.02.2017

Похоже, в данном случае вы злоупотребляете идеей ИППП. Общее правило заключается в том, что у вас могут быть разные ассоциации для разных дочерних моделей и разное поведение, НО у вас ВСЕГДА есть все столбцы таблицы, используемые всеми дочерними моделями.

Вся идея, почему вы хотели бы использовать STI, заключается в том, что все модели содержат одинаковую структуру данных, но могут иметь различное поведение. В вашем случае я бы предложил использовать ассоциации (как вы сами предложили), а затем добавить has_one/has_many в дочернюю модель, что ограничило бы область ассоциаций в цепочке наследования.

Невозможно ограничить столбцы только некоторыми дочерними моделями без исправления ApplicationRecord. Но в любом случае, даже если вам удастся сделать патч, чтобы ввести такое поведение, ваша таблица базы данных по-прежнему будет иметь все столбцы для всех таблиц, что приведет к увеличению таблиц базы данных из-за полупустых столбцов, увеличению размера и уменьшению спектакль.

Я надеюсь, что это отвечает на ваш вопрос.

person Kkulikovskis    schedule 14.02.2017
comment
я имел в виду только это определение наследования postgresql.org/docs/9.5 /static/ddl-inherit.html возможно, рельсы имеют другое определение наследования от PostgreSQL - person Abdelkrim Tabet Aoul; 14.02.2017
comment
а что с ЦТИ? sequel.jeremyevans.net/rdoc-plugins/classes/Sequel/ Плагины/ - person Abdelkrim Tabet Aoul; 14.02.2017
comment
Но, как я понимаю, вы говорите о реализации STI в Rails, верно? Приведенные вами примеры - это разные понятия. - person Kkulikovskis; 14.02.2017
comment
да, это правда, я спрашивал о STI, но в конце своего вопроса я также спросил, есть ли лучшее решение, я только начинаю понимать разницу между STI и CTI. - person Abdelkrim Tabet Aoul; 14.02.2017