6

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

用户has_many通过作业进行项目。但是,Assignment 实际上有两个与用户相关的外键:(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

我想创建另一个关联,称为:completed_projects,它completer_id用作模型中 User 的外键: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 添加到项目表中,无论如何住在那里都是有意义的。

如果您需要/想要使用 has_many :通过您可以查看使用 named_scopes (Rails 版本允许)所以您可以说user.projects.completeduser.projects.incomplete

于 2010-01-18T15:14:43.513 回答