在has_many:through关系中指定外键

jak*_*xer 6 model ruby-on-rails associations has-many-through

我有以下三个模型:用户,项目和分配.

用户has_many通过作业进行投射.但是,Assignment实际上有两个与User相关的外键:( user_id表示分配了项目completer_id的用户)和(表示完成项目的用户).

通常,user_id并且completer_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
Run Code Online (Sandbox Code Playgroud)

我想创建一个名为的另一个关联,:completed_projectscompleter_id:through模型中用作User的外键,而不是:user_id.是否有可能做到这一点?

而且,顺便说一句,我知道这个:foreign_key选项.但是,使用时会忽略此选项:through,因此我想知道是否有办法在没有它的情况下执行此操作.

最后,我应该提到我对其他设计持开放态度,如果不能这样做,有人可以想出更好的方法.

zet*_*tic 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}'
Run Code Online (Sandbox Code Playgroud)