我有以下三种模式:用户,项目,并分配

通过指派A用户has_many项目。然而,分配实际上具有的的,涉及到用户的外键: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,所以我想知道是否有一种方法可以做到这一点没有它这个选项被忽略。

最后,我要指出,我开放给其他的设计,如果不能做到这样的,有人能想到更好的办法。

有帮助吗?

解决方案

您可以随时使用SQL的选择,如果ActiveRecord并不会轻易表达开箱的关系:

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:通过,你可以看看使用named_scopes(Rails的版本允许)所以你可以说user.projects.completeduser.projects.incomplete

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top