我在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是否有任何变化。
答案 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;不同型号的各种属性。这将为您提供仅使用正确的数据填充模型的能力,尽管只是一点点破解