1

У меня есть модель Student, наследуя модель пользователяRails - добавление нового поля inherting класса

< занятия Студенческой Пользователь

если добавить новое поле Student, его не показывая вверх. Все, что я вижу, это копия полей User в таблице Student.

рельсы электронной почты г Модель пользователя: имя строки: строка пол: булево
рельсам г модель студенческого возраста: целое

грабли БД: мигрировать

модель Пользователь:

класс Пользователь < ActiveRecord :: Base
проверяет: email,: имя, наличие: tr у.е
конец

тогда я заменил
учащемуся Студенту < ActiveRecord :: Base с

класса Student < пользователя
конец

сейчас: поле возраст заменяется: email,: name,: gender fields in Student table, У меня нет доступа к: возрасту поле больше

Ученик должен иметь поля Пользователя, а также дополнительные поля.
Как мне это достичь?

+1

то, что вы есть одна таблица наследования http://api.rubyonrails.org/cl asses/ActiveRecord/Inheritance.html – Joel

+0

вы можете показать нам код, который фактически добавляет «поле», которое вы не видите (покажите первые несколько строк вашей модели Студента, например) и, возможно, немного больше модели пользователя, поэтому мы можем видеть, является ли его activerecord или просто простой рубиновый класс. – Phil

+0

@Phil - Я попытался добавить еще одно поле через миграцию, но я не вижу, чтобы какое-либо поле добавлялось в таблицу Student, можете ли вы сказать мне, где я ошибаюсь? –

ответ

3

Я думаю, что вы путаетесь между tables и models в Rails.

Как указано в комментариях, у вас есть установка Single Table Inheritance; вы будете иметь одну users таблицу, которая может быть экстраполированы на различные классы (модели) с использованием Type атрибута:

#app/models/user.rb 
class User < ActiveRecord::Base 
    #columns id | type | other | user | attributes | created_at | updated_at 
end 

#app/models/student.rb 
class Student < User 
    # uses "users" table 

    def custom_method 
    #=> Will only appear with @student.custom_method (IE @user.custom_method will not exist) 
    end 
end 

Это означает, что вы не имеете две таблицы в данном случае; Student будет использовать таблицу User.

Если вы хотите использовать пользовательские атрибуты в модели Student, вы можете (описанные выше). В конечном счете, с STI, вы должны использовать ту же таблицу для всех унаследованных моделей. Если вам нужно добавить дополнительные атрибуты, вам придется добавить в таблицу «parent».

-

Студент должен иметь поля пользователя, а также дополнительные поля своей собственной

Если есть много атрибутов, вам придется установить еще одну таблицу для хранения их, а затем сопоставить две модели.Это будет грязнее, но это лучше, чем хранить огромное количество пустых ячеек в одной таблице:

#app/models/user.rb 
class Student < ActiveRecord::Base 
    has_one :profile 
end 

#app/models/profile.rb 
class Profile < ActiveRecord::Base 
    belongs_to :student 
end 

Это, как мы храним наши пользователи в некоторых из наших приложений:

enter image description here

Этот дает нам возможность вызова @user.profile.homepage и т.д., или если мы хотим передать его:

#app/models/user.rb 
class User < ActiveRecord::Base 
    has_one :profile 
    delegate :homepage, to: :profile, prefix: true #-> @user.profile_homepage 
end 
+0

Удивительный! Это понятно, спасибо. –