2010-07-10 3 views
0

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

http://localhost:3000/teachers/new

Он показывает ошибку:

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

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

http://localhost:3000/users/new

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

ответ

2

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

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

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

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

Более полное описание того, как работает STI, можно найти в Martin Fowlers Book(Patterns of Enterprise Application Architecture).

0

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

2

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

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

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