我有几个类如下所示:
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?
对于列表中的每个"人"?
我经常需要做类似的操作,那么单表继承会是更好的选择吗?
看起来您想要实现的是类表继承。
(参见前面的问题,例如"Rails3中的类表继承")
有各种各样的宝石试图实现这一点,他们每个人都有自己的观点。
从根本上说,如果你只知道"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的单表继承,或者考虑另一种实现方式。
如果是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的多对多关联,这样一个人既可以是学生也可以是员工,这是完全可能的