#sql #ruby-on-rails #inheritance #sti
#sql #ruby-on-rails #наследование #sti
Вопрос:
У меня есть таблица с именем people
, каждая person
из которых может быть a client
, a manager
, an accountant
или любой комбинацией из этих трех. Кроме того, у каждого из них есть специальные столбцы таблицы, помимо тех, что указаны в people
таблице.
То, что я делаю сейчас, — это использую a person_id
в каждой из таблиц… но я думаю, что было бы намного проще просто использовать одну и ту же таблицу и разные модели для каждой из них, чтобы я мог управлять ими по отдельности.
Должен ли я это сделать?
Ответ №1:
У вас нет хорошей иерархии наследования, поэтому я не думаю, что STI применяется. Например, как бы вы представили человека, который был одновременно менеджером и бухгалтером, с точки зрения (единого) наследования?
Если бы у человека могла быть только одна из трех ролей, тогда, возможно, STI имело бы смысл; но даже тогда реализация ролей с использованием наследования должна вызывать у вас в голове тревожные звоночки, вы должны знать, что одному человеку рано или поздно понадобится несколько ролей (и это, вероятно, немедленно станет критической необходимостью после родов).
Комментарии:
1. Я использую флаги в таблице и default_scope:
t.boolean :is_client
иdefault_scope where(is_client: true)
и затем:def destroy; if not new_record?; update_attribute :is_client, false; end; freeze; end