1

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

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?

对于列表中的每个“人”?

我需要经常做类似的操作,那么单表继承会是更好的选择吗?

4

2 回答 2

1

看起来您要实现的是Class Table Inheritance

(参见前面的问题。例如“Rails 3 中的类表继承”

有各种各样的 gem 试图实现这一点,他们每个人都有自己的观点。

从根本上说,如果您只知道“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

重要的是,Person 既可以是员工,也可以是学生。

如果不是这样,那么我建议您查看 Rails 的单表继承,或者考虑另一种实现方式。

于 2013-07-22T13:08:46.180 回答
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 建立多对多关联,这样一个人就可以既是学生又是员工) 这完全有可能

于 2013-07-22T13:04:44.573 回答