gpt4 book ai didi

ruby-on-rails - 在 has_many 中指定外键 :through relationship

转载 作者:行者123 更新时间:2023-12-01 22:08:45 25 4
gpt4 key购买 nike

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

用户has_many 通过分配进行项目。但是,Assignment 实际上有两个 与用户相关的外键: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 时会忽略此选项,因此我想知道是否有办法在不使用它的情况下执行此操作。

最后,我应该提到,如果不能以这种方式完成并且有人可以想到更好的方法,我对其他设计持开放态度。

最佳答案

如果 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}'

关于ruby-on-rails - 在 has_many 中指定外键 :through relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2084164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com