2017-02-14 3 views
0

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

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

Благодаря

ответ

3

Надеются, что вы Преуспевая

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

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

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

+0

Спасибо, я буду использовать опцию полиморфной ассоциации, но я буду ждать когда-нибудь в случае, если у кого-то есть еще одна новая опция, чтобы предложить –

+0

Да, конечно ..... –

+0

Ваш прием .. –

0

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

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

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

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

+0

Я ссылался только на это определение Наследование https://www.postgresql.org/docs/9.5/static/ddl-inherit.html perhaprs rails имеет другое определение наследования от PostgreSQL –

+0

и что относительно CTI? http://sequel.jeremyevans.net/rdoc-plugins/classes/Sequel/Plugins/ClassTableInheritance.html –

+0

Но как я понимаю, вы говорите о реализации Rails STI, правильно? Представленные вами примеры - это разные концепции. – Kkulikovskis

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