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 中的 tables
和 models
感到困惑。
如评论中所述,您有一个 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
我有Student模型,继承User模型
class Student < User
如果我向学生添加新字段,它不会显示。我所看到的只是 Student table.
中用户字段的副本rails g model User email:string name:string gender:boolean
rails g model Student age:integerrake 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 中的 tables
和 models
感到困惑。
如评论中所述,您有一个 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