次の関連付けを持つ2つのクラスがあります。
class Incident
has_one :assignee
has_one :technician
class User
has_many :incidents
担当者と技術者のフィールドは、タイプUserのオブジェクトを参照していることに注意してください。これらの関係はモデルにどのように含まれるべきですか?
次の関連付けを持つ2つのクラスがあります。
class Incident
has_one :assignee
has_one :technician
class User
has_many :incidents
担当者と技術者のフィールドは、タイプUserのオブジェクトを参照していることに注意してください。これらの関係はモデルにどのように含まれるべきですか?
これらの関係を保持する外部キーは、従業員テーブルではなくインシデント テーブルにあるため、おそらくインシデントは担当者と技術者に属する必要があります。
クラスインシデント 所属先:担当者, :クラス名 => 'ユーザー' 所属先:技術者, :クラス名 => 'ユーザー' クラス ユーザー 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
この質問にアクセスした人がすべてをまとめるのに苦労している場合に備えて、この問題に対する完全な回答を次に示します (私が最初にこれを調べたときのように)。
答えの一部は移行で行われ、一部はモデルで行われます。
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
これらのいずれかを実行すると、インシデント モデルのインスタンスの配列が返されます。