Я думаю, что вы путаетесь между 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
Это, как мы храним наши пользователи в некоторых из наших приложений:
Этот дает нам возможность вызова @user.profile.homepage
и т.д., или если мы хотим передать его:
#app/models/user.rb
class User < ActiveRecord::Base
has_one :profile
delegate :homepage, to: :profile, prefix: true #-> @user.profile_homepage
end
то, что вы есть одна таблица наследования http://api.rubyonrails.org/cl asses/ActiveRecord/Inheritance.html – Joel
вы можете показать нам код, который фактически добавляет «поле», которое вы не видите (покажите первые несколько строк вашей модели Студента, например) и, возможно, немного больше модели пользователя, поэтому мы можем видеть, является ли его activerecord или просто простой рубиновый класс. – Phil
@Phil - Я попытался добавить еще одно поле через миграцию, но я не вижу, чтобы какое-либо поле добавлялось в таблицу Student, можете ли вы сказать мне, где я ошибаюсь? –