Как работает наследование таблиц в Rails? - PullRequest
0 голосов
/ 10 июля 2010

У меня есть пользовательская таблица и недавно созданный учитель. Учитель - это подкласс пользователя, поэтому я использую генератор скаффолдов для генерации таблицы учителя, затем я изменяю модель, чтобы учитель был подклассом пользователя. После всего этого я сделал db: migrate. Затем я иду к

http://localhost:3000/teachers/new

Показывает ошибку:

undefined method `teacherSalary' for #<Teacher:0x103331900>

Итак, мой вопрос: что я сделал не так? Я хочу создать страницу для регистрации пользователя, пользователь может быть ТОЛЬКО учителем / учеником. Но я не могу добавить запись учителя ... ... Более того, я иду на

http://localhost:3000/users/new

Я хочу иметь поле со списком, позволяющее пользователю регистрировать своего пользователя как "учителя" или "ученика". Но все, кажется, не работает, как я ожидал. Что я должен сделать? Большое спасибо за вашу помощь.

Ответы [ 3 ]

2 голосов
/ 21 декабря 2010

Я нашел это определение очень удобным: STI означает, что одна таблица содержит данные более чем одной модели , обычно дифференцируемые по столбцу «тип». (таблица «пользователи» содержит данные для моделей «Учитель», «Ученик», «Сотрудник», «Помощник» и т. д.) Сохраняет похожие модели в одной таблице вместо создания новых.

Полиморфная ассоциация означает, что одна модель может быть связана с более чем одной другой моделью (комментарий может принадлежать записи, изображению, файлу, user_type ...) Чтобы предотвратить конфликты внешних ключей, ассоциация представлена ​​столбцами * _id и * _type вместо только * _id.

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

В вашей базе данных у вас должна быть одна таблица с именем users. Эта таблица должна иметь строковый столбец, который по умолчанию называется типом. Если вы используете другое имя для этого столбца, вам придется вручную указать имя столбца наследования, используя self.inheritance_column = "column_name"

В вашем приложении есть три модели: пользователь, студент и учитель. Пользователь наследует от ActiveRecord :: Base как обычно, ученик и учитель наследуют от пользователя.

После этого вы сможете создавать новые объекты Учителя и Ученика. Внутренне это работает путем записи имени модели в поле типа в пользовательских таблицах, а затем, когда вы используете Student.find, он добавляет предложение в SQL, чтобы возвращать только те строки, где type = 'Student'

Вы можете добавить общее поведение в класс User, например, проверки и т. д. затем добавляют дополнительное поведение к унаследованным классам.

Более полное описание того, как работает ИППП, можно найти в Martin Fowlers Book (Образцы архитектуры корпоративных приложений) .

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

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

...