Я поражен тем, как трудно все еще найти однозначный ответ на этот вопрос: это кажется настолько распространенным, что я, должно быть, смотрю на все это неправильно.
У нас есть пользователи, чьи роли авторизации выполняют что-тонапример, ROLES =% w [администратор-модератор-ученик забанен]
Обычно рекомендуется использовать поле ROLES и наследование одной таблицы для (как здесь )
class User < ActiveRecord::Base
end
class Student < User
end
class Teacher < User
end
Но это помещает все данные в одну таблицу.Что если у нас будет достаточно данных, уникальных для каждого типа пользователя?
student
year:integer
request_id:integer
portfolio_id:integer
status:string
...
teachers
user_id:integer
district:string
school:string
subject1:string
subject2:string
specialty:string
bio:text
...
STI дает такие вещи, как student.specialty и teacher.portfolio_id, которые мы не хотим и должны были бы заблокировать.
Ruby Way предлагает класс абстрактной базовой модели для обработки отдельных таблиц:
class User < ActiveRecord::Base
self.abstract = true
end
class Student < User
end
class Teacher < User
end
, что позволит использовать уникальные таблицы как для ученика, так и для учителя.Однако он предупреждает, что User.find (: all) не будет работать.Плюс, есть общие атрибуты, которые мы хотели, и в этом вся суть модели User:
User
username:string
email:string
password:string
role:string
Поскольку нет таблицы User, нет общих атрибутов?
Различные другие ответы намекают наиспользуя :polymorphic => true
, :class_name => 'User'
или as:
, но все объясняется больше как добавление комментариев к сообщению и изображению.Что не кажется хорошей параллелью.
Кажется, я помню по крайней мере один язык (и, возможно, пару OODB), который просто использовал отношение IS-A для наследования атрибутов.
Какой путь у РЕЙЛОВ?