4

次の関連付けを持つ2つのクラスがあります。

class Incident
  has_one :assignee
  has_one :technician

class User 
  has_many :incidents

担当者と技術者のフィールドは、タイプUserのオブジェクトを参照していることに注意してください。これらの関係はモデルにどのように含まれるべきですか?

4

2 に答える 2

9

これらの関係を保持する外部キーは、従業員テーブルではなくインシデント テーブルにあるため、おそらくインシデントは担当者と技術者に属する必要があります。

クラスインシデント
  所属先:担当者, :クラス名 => 'ユーザー'
  所属先:技術者, :クラス名 => 'ユーザー'

クラス ユーザー
  has_many :assigned_incidents, :class_name => 'インシデント', :foreign_key => 'assignee_id'

  # この関係に使用したい言葉遣いがわからない
  has_many :technician_incidents, :class_name => 'インシデント', :foreign_key => 'technician_id'

外部キー フィールドをincidents.assignee_id,incidents.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 と呼ばれる 2 つの列があり、別のテーブルへの参照を保持していることを指定しています。Rails は実際に「assignee_id」と「technician_id」という列を作成します。この場合、それぞれが Users テーブルの行を参照しますが、移行ではなくモデルで指定します。

モデル

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

ここでは、Incident モデルに :assignee という名前のプロパティを作成し、このプロパティが User クラスのインスタンスを参照するように指定しています。「belongs_to」を確認したRailsは、上で定義した「assignee_id」というデータベース内の列を探し、それを使用して外部キーを格納します。次に、技術者に対してまったく同じことをしています。

これにより、次のように、インシデント モデルのインスタンスを介して、担当者と技術者 (両方ともユーザー モデルのインスタンス) にアクセスできます。

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」と呼ばれます。次に、incidents_as_technician に対して同じことを行っています (この名前付けはややぎこちないように見えますが、何をしようとしているのかをよく理解していないため、私には素晴らしい提案がありません)。

これにより、次のようにして、ユーザーに割り当てられたすべてのインシデントまたはインシデントを技術者として取得できます。

User.assigned_incidents
User.incidents_as_technician

これらのいずれかを実行すると、インシデント モデルのインスタンスの配列が返されます。

于 2012-04-23T22:05:18.927 に答える