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_projects它completer_id在:through模型中用作User的外键,而不是:user_id.是否有可能做到这一点?
而且,顺便说一句,我知道这个:foreign_key选项.但是,使用时会忽略此选项:through,因此我想知道是否有办法在没有它的情况下执行此操作.
最后,我应该提到我对其他设计持开放态度,如果不能这样做,有人可以想出更好的方法.
如果 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)
| 归档时间: |
|
| 查看次数: |
9664 次 |
| 最近记录: |