4

我有两个具有以下关联的类:

class Incident
  has_one :assignee
  has_one :technician

class User 
  has_many :incidents

请注意,受理人和技术人员字段是指用户类型的对象。这些关系在模型中应该如何?

4

2 回答 2

9

据推测,事件应该属于受让人和技术人员,因为持有这些关系的外键将在事件表中,而不是在雇员表中

类事件
  belongs_to :assignee, :class_name => '用户'
  belongs_to :technician, :class_name => '用户'

类用户
  has_many :assigned_incidents, :class_name => '事件', :foreign_key => 'assignee_id'

  # 不确定你想为这种关系使用的措辞
  has_many :technician_incidents, :class_name => '事件', :foreign_key => 'technician_id'

您希望外键字段incidents.assignee_idincidents.technician_id

于 2009-04-08T22:11:47.260 回答
1

这是这个问题的完整答案,以防访问这个问题的人很难将所有东西放在一起(就像我第一次研究这个问题时一样)。

答案的某些部分发生在您的迁移中,而某些部分发生在您的模型中:

迁移

class CreateIncidents < ActiveRecord::Migration
  create_table :incidents do |t|
    def up
      t.references :assignee
      t.references :technician
    end
  end
end

在这里,您指定此表中有两列将被称为 :assignee 和 :technician 并保存对另一个表的引用。Rails 实际上会为您创建名为“assignee_id”和“technician_id”的列。在我们的例子中,它们将引用用户表中的每个行,但我们在模型中指定,而不是在迁移中。

楷模

class Incident < ActiveRecord::Base
  belongs_to :assignee, class_name => 'User'
  belongs_to :technician, class_name => 'User'
end

在这里,您将在名为 :assignee 的事件模型上创建一个属性,然后指定该属性将引用 User 类的一个实例。Rails 看到“belongs_to”,将在您的数据库中查找我们上面定义的名为“assignee_id”的列,并使用它来存储外键。然后你为技术人员做同样的事情。

这将允许您通过 Incident 模型的实例访问您的受让人和技术人员,这两个实例都是 User 模型的实例,如下所示:

Incident.assignee.name
Incident.technician.email

这是您的用户模型:

class User < ActiveRecord::Base
  has_many :assigned_incidents, :class_name => 'Incident', :foreign_key => 'assignee_id'
  has_many :incidents_as_technician, :class_name => 'Incident', :foreign_key => 'technician_id'
end

在这里,您将在用户模型上创建一个名为 :assigned_incidents 的属性,指定此属性将引用事件模型的实例,以及引用此事件模型的外键,即我们要使用的用户模型此属性称为“assignee_id”。然后你在为 events_as_technician 做同样的事情(这个命名似乎有点尴尬,但如果没有更好地了解你想要做什么,我真的没有什么好的建议)。

这允许您通过执行以下操作获取用户分配的所有事件或作为技术人员的事件:

User.assigned_incidents
User.incidents_as_technician

执行其中任何一个都将返回 Incident 模型的实例数组。

于 2012-04-23T22:05:18.927 回答