has_manyの中に外部キーを指定:関係を通じて
-
21-09-2019 - |
質問
私は、次の3つのモデルがあります:ユーザー、プロジェクト、および割り当て
割り当ててユーザーhas_many
プロジェクト。しかし、割り当てが実際に持っているの2つののユーザーに関連する外部キー:。user_id
とcompleter_id
(プロジェクトを割り当てられたユーザーを表す)(プロジェクトを完了したユーザーを表す)
多くの場合、user_id
とcompleter_id
は同じになります。別のユーザーがそれを完了した場合は、USER_IDとcompleter_idは異なるものになります。
私のUserモデルでは、私は次のことを持ってます:
class User < ActiveRecord::Base
has_many :assignments
has_many :incomplete_assignments, :class_name => 'Assignment',
:conditions => 'completer_id IS NULL'
has_many :completed_assignments, :class_name => 'Assignment',
:foreign_key => 'completer_id'
# this is the important one
has_many :incomplete_projects,
:through => :assignments,
:source => :project,
:conditions => 'completer_id IS NULL'
end
私は、外国:completed_projects
モデルでのユーザーのためのキーではなく、completer_id
として:through
を使用しています:user_id
と呼ばれる別の関連付けを、したいと思います。 ?これを実行することが可能です。
そして、さておき、私は:foreign_key
オプションを認識していて。私はそれなしでこれを行う方法がありますかどうかを知りたいので、:through
を使用している場合ただし、このオプションは無視されます。
最後に、私はそれがこの方法を行うことはできませんし、誰かがより良い方法を考えることができれば、私は、他のデザインに開いていることを言及する必要があります。
解決
ActiveRecordのは、簡単にボックスの関係を表現することができない場合は、常に選択のためのSQLを使用することができます:
has_many :completed_projects,
:class_name => "Project",
:finder_sql => 'SELECT p.* FROM projects p ' +
'INNER JOIN assignments a ON p.id=a.project_id ' +
'INNER JOIN users u on u.id=a.completer_id ' +
'WHERE u.id=#{id}'
他のヒント
あなたの割り当てテーブル内の他のメタデータを持っていますか?
私はちょうどHABTMを使用して、代わりにプロジェクトテーブルにcompleter_idを追加していない場合は、とにかくそこに住むことは理にかなっています。
あなたが必要な場合は/にhas_manyを使いたい:あなたはuser.projects.completed
とuser.projects.incomplete