在Ruby on Rails中使用Table Per Type继承时如何获得类型?

时间:2013-07-22 12:54:33

标签: ruby-on-rails

我有几个看起来像这样的课程:

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?

列表中的每个“人”?

我需要经常进行类似的操作,单表继承是一个更好的选择吗?

2 个答案:

答案 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) )这是完全可能的