多态用户表设计模式活动记录

时间:2014-08-15 06:28:11

标签: ruby-on-rails activerecord

我在rails应用程序中建模用户

Student < User
Parent < User
Staff < User
User

每个实体的属性略有不同。我打算使用STI,但认为可能有更好的方法对此进行建模 例如原来我有

User
--------
id #primary key
name #common
email #common
type [Student|Parent|Staff]
id      # Student only
school  # Student only
year    # Student only
title   # Parent only
work    # Parent only

即相反,我想把它分成多个表,一个包含所有用户的User表,然后通过自然键加入用户特定的表。 计划使用NATURAL JOINS 例如DB看起来像

User
--------
id
name
email
type [Student|Parent|Staff]

Student
--------
id
school
year

Parent
-------
title
work

那么如何获得活动记录来进行学生和用户表的自然联接

即。我希望能够做类似

的事情
class Student < ActiveRecord::Base  
end           
# would create an entry in Student and User tables.
Student.create(name:'john',school:'green high') 
# get via field in User table and puts out field in Student table
student = Student.where(email:'a@a.com') 
puts student.school

有点想找点东西 http://viralpatel.net/blogs/hibernate-inheritance-table-per-concrete-class-annotation-xml-mapping/

P.S我即将升级到Rails 4,如果在语法上有所区别,我想知道rails 4对rails 3是否有任何变化。

1 个答案:

答案 0 :(得分:0)

这是猜测,但由于您没有收到太多反馈,请让我详细说明我的工作方式:

-

<强> STI

我会将所有条目保存在单个表中,然后根据我使用Rails的经验扩展到类(how STI's generally work

因此,我会保留您的原始设置(保持干燥状态),并具有以下内容:

#app/models/user.rb
Class User < ActiveRecord::Base
   # fields:
   # id #primary key
   # name #common
   # email #common
   # type [Student|Parent|Staff]
   # school  # Student only
   # year    # Student only
   # title   # Parent only
   # work    # Parent only
end

#app/models/student.rb
Class Student < User
    remove_method "title"
    remove_method "title="

    remove_method "work"
    remove_method "work="
end

#app/models/parent.rb
Class Parent < User
    remove_method "school"
    remove_method "school="

    remove_method "year"
    remove_method "year="
end

#app/models/staff.rb
Class Staff < User
end

这将使您能够执行以下操作:

@student = Student.create(name: "x", school: "y")

当然,不会填充各种属性,这会让我查找这个问题:Hiding an attribute in an ActiveRecord model

显然,您可以使用remove_method方法来隐藏&#34;不同型号的各种属性。这将为您提供仅使用正确的数据填充模型的能力,尽管只是一点点破解