我有几个看起来像这样的课程:
Person {
id(PK)
first_name string
last_name string
}
class Employee {
person_id(FK)
job_description string
}
class Student {
person_id(FK)
school_name string
}
如果我有一个庞大的人员名单,我怎么能在不必做的情况下弄清楚每个人的类型
Student.where(person_id = person.id).any?
和
Employee.where(person_id = person.id).any?
列表中的每个“人”?
我需要经常进行类似的操作,单表继承是一个更好的选择吗?
答案 0 :(得分:1)
您尝试实施的内容似乎是Class Table Inheritance。
(参见前面的问题。例如"Class Table Inheritance in Rails 3")
有各种各样的宝石试图实现这一点, 他们每个人都有自己的意见。
如果您只知道“person_id”,那么您将始终需要查找其他表以查找它所在的类。
在不改变任何基本原则的情况下,最简单的方法是使用rails'has_one
在两个表之间创建缓存关系。
class Person
has_one :employee_details, class_name: "Employee"
has_one :student_details, class_name: "Student"
def employee?
employee_details.present?
end
def student?
student_details.present?
end
end
重要的是,一个人既可以是雇员也可以是学生。
如果不是这种情况,那么我建议您查看Rails的单表继承,或者考虑另一种实现相同的方法。
答案 1 :(得分:0)
如果是Ruby on Rails(ActiveRecord)
class Person < ActiveRecord::Base
has_many :employees
has_many :students
end
class Employee
belongs_to :person
end
class Student
belongs_to :person
end
Person.find(person_id).students.any?
Person.find(person_id).employees.any?
另外,为了记录,我只是回答了你所说的问题。我认为一个更好的设计是拥有一个名为(Role)的类,并让Employee和Student从中扩展,这样你就可以与Role建立多对多关联,这样一个人既可以是学生也可以是员工(s) )这是完全可能的