在RubyonRails中使用TablePerType继承时,如何获得类型



我有几个类如下所示:

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的多对多关联,这样一个人既可以是学生也可以是员工,这是完全可能的

最新更新