質問

私は、次の3つのモデルがあります:ユーザー、プロジェクト、および割り当て

割り当てて

ユーザーhas_manyプロジェクト。しかし、割り当てが実際に持っているの2つののユーザーに関連する外部キー:。user_idcompleter_id(プロジェクトを割り当てられたユーザーを表す)(プロジェクトを完了したユーザーを表す)

(プロジェクトを割り当てられたユーザーがそれを完了した場合)

多くの場合、user_idcompleter_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.completeduser.projects.incomplete

を言うことができるので、あなたがnamed_scopes(Railsのバージョン許可)を使用して見て可能性が通過
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top