Что я должен сделать, чтобы сделать полиморфные отношения в RoR? - PullRequest
0 голосов
/ 10 июля 2010

У меня есть пользовательская таблица и столбец ролей, в котором указана их роль.Теперь я хочу добавить таблицу «Студент», в которой есть номер студента, и я также хочу добавить «Учитель», чтобы сохранить зарплату учителя.

И ученик, и учитель являются подклассом пользователя.Теперь я добавил столбец роли уже в таблице пользователей: «T» = «Учитель» и «S» = «Ученик».Теперь я хочу добавить «Ученик» и «Учитель» в базу данных.Что я должен делать?Генерировать эшафот или только миграцию?Также необходимо модифицировать мои модели?или мне просто нужно только изменить контроллер ??

спасибо.

Ответы [ 2 ]

1 голос
/ 10 июля 2010

Это больше похоже на работу для наследования единой таблицы в Rails.Это действительно легко использовать.Вместо использования отдельной таблицы для хранения ролей.Унаследуйте модели своего ученика и учителя от пользователя.например:

User < ActiveRecord::Base; ... end
Student < User; ... end
Teacher < User; ... end

Rails автоматически создает столбец типа и сохраняет там класс.User.all вернет всех пользователей Student.all вернет пользователей, если тип соответствует типу Student, и Teacher.all сделает то же самое для всех учителей.

Подробнее о наследовании одной таблицы можно узнать на Документация ActiveRecord и здесь .

0 голосов
/ 10 июля 2010

Как сказал Нуклеарсандвич, это ситуация, которая требует STI рельсов (наследование одной таблицы), а не полиморфных ассоциаций.

Просто чтобы подчеркнуть разницу:
1) Наследование отдельных таблиц используется, когда у вас есть разные модели, которые очень похожи друг на друга с небольшими отличиями. STI объединяет все модели в одной таблице базы данных с полями (столбцами) для всех моделей, которые используют эту таблицу. Также есть поле типа, которое указывает, к какой модели принадлежит эта запись.
Ваш случай - прекрасный пример ИППП. У вас есть модели пользователей, учеников и учителей, у них много общих полей и функций, вам просто нужно дополнительное поле для ученика и учителя.

2) Полиморфная ассоциация используется, когда у вас есть модель, которая будет связана с различными моделями. Например, представьте, что у вас есть модель «Адрес». Также у вас есть модель «Компания» и «Пользователь», обе из которых могут иметь адрес.
В вашей модели адреса вы можете указать

belongs_to :user
belongs_to :company

А затем убедитесь, что адрес принадлежит компании, чтобы не вызывать address.user и наоборот. Однако лучший способ сделать это - полиморфная ассоциация. В вашей модели адреса вы делаете

belongs_to :addressable, :polymorphic => true

и в модель своего пользователя и компании добавьте

has_one :address, :as => :addressable

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...