Rails - 为inherting class

时间:2015-10-02 19:25:25

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2 ruby-on-rails-3.1

我有学生模型,继承了用户模型

  

班级学生<用户

如果我向学生添加新字段,则不会显示。我看到的只是学生表中用户字段的副本。

  

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

学生应该拥​​有用户字段以及自己的其他字段。
我该如何实现这个目标?

1 个答案:

答案 0 :(得分:3)

我认为你在Rails中的tablesmodels之间感到困惑。

如评论中所述,您有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

这就是我们将用户存储在某些应用中的方式:

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