Rails - 添加新字段以继承 class

Rails - adding new field to inherting class

我有Student模型,继承User模型

class Student < User

如果我向学生添加新字段,它不会显示。我所看到的只是 Student table.

中用户字段的副本

rails g model User email:string name:string gender:boolean
rails g model Student age:integer

rake db:migrate

用户模型:

class User < ActiveRecord::Base
validates :email, :name, presence: true
end

然后我将
class Student < ActiveRecord::Base 替换为

class Student < User
end

现在 Student table 中的 :age 字段被 :email, :name, :gender 字段取代,我无法再访问 :age 字段

学生应该有用户字段以及自己的附加字段。
我该如何实现?

我认为您对 Rails 中的 tablesmodels 感到困惑。

如评论中所述,您有一个 Single Table Inheritance 设置;你将有一个 users table 可以使用 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

这意味着您在这种情况下没有两个 table; Student 将使用 User table。

如果您希望在 Student 模型中使用自定义属性,您可以(如上所述)。最终,对于 STI,您必须对所有继承模型使用相同的 table。如果你需要添加额外的属性,你将不得不附加到 "parent" table.

--

Student should have User fields as well as additional fields of its own

如果属性比较多,就得再设置一个table来存放,然后把两个模型关联起来。它会更混乱,但比在单个 table:

中存储大量空单元格要好
#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