我有学生模型,继承了用户模型
班级学生<用户
如果我向学生添加新字段,则不会显示。我看到的只是学生表中用户字段的副本。
rails g model用户电子邮件:字符串名称:string gender:boolean
rails g model学生年龄:整数rake db:migrate
用户模型:
class User< ActiveRecord :: Base
验证:电子邮件:名称,存在:真实 端
然后我取代了班级学生< ActiveRecord :: Base with
班级学生<用户
端
现在:age字段被替换为:email,:name,:Student表中的性别字段,我无权访问:age field
学生应该拥有用户字段以及自己的其他字段。
我该如何实现这个目标?
答案 0 :(得分:3)
我认为你在Rails中的tables
和models
之间感到困惑。
如评论中所述,您有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,您必须对所有继承的模型使用相同的表。如果您需要添加额外的属性,则必须附加到“父”表。
-
学生应该拥有用户字段以及自己的其他字段
如果有很多属性,则必须设置另一个表来存储它们,然后关联这两个模型。它会变得更加混乱,但它比将大量空单元格存储在一个表中更好:
#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