6

ユーザー、プロジェクト、割り当ての3つのモデルがあります。

ユーザーhas_manyは割り当てを通じてプロジェクトを作成します。ただし、Assignmentには、実際にはユーザーに関連する2つの外部キーがあります:(user_idプロジェクトを割り当てられたユーザーをcompleter_id表す)と(プロジェクトを完了したユーザーを表す)。

多くの場合、同じuser_idcompleter_idなります(プロジェクトを割り当てられたユーザーがプロジェクトを完了した場合)。ただし、別のユーザーがそれを完了すると、user_idとcompleter_idは異なります。

私のユーザーモデルには、次のものがあります。

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せずにこれを行う方法があるかどうかを知りたいと思います。

最後に、この方法でそれを行うことができず、誰かがより良い方法を考えることができる場合、私は他のデザインを受け入れることを言及する必要があります。

4

2 に答える 2

3

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}'
于 2010-01-18T09:53:49.810 に答える
2

割り当てテーブルに他のメタデータがありますか?

そうでない場合は、habtmを使用して、代わりにcompleter_idをprojectsテーブルに追加しますが、とにかくそこに住むのは理にかなっています。

has_many:throughを使用する必要がある/使用したい場合は、named_scopes(Railsバージョンが許可されている)の使用を検討して、次のように言うことができますuser.projects.completeduser.projects.incomplete

于 2010-01-18T15:14:43.513 に答える