指定在的has_many外键:通过关系
-
21-09-2019 - |
题
我有以下三种模式:用户,项目,并分配
。通过指派A用户has_many
项目。然而,分配实际上具有的双的,涉及到用户的外键: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
作为在: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.completed
和user.projects.incomplete
不隶属于 StackOverflow