【问题标题】:Specifying the foreign key in a has_many :through relationship在 has_many :through 关系中指定外键
【发布时间】:2011-01-06 06:00:44
【问题描述】:

我有以下三个模型:User、Project 和 Assignment。

用户has_many 通过分配进行项目。但是,Assignment 实际上有两个与用户相关的外键:user_id(代表被分配项目的用户)和completer_id(代表完成项目的用户)。 p>

通常,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 做一些中等复杂的事情。 :)

标签: ruby-on-rails model associations has-many-through


【解决方案1】:

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

【讨论】:

  • 据我所知,这是唯一的方法。非常感谢。
  • 不幸的是,使用 :finder_sql 会中断链接。 user.completed_projects.limit(2) 不起作用。
【解决方案2】:

您的作业表中还有其他元数据吗?

如果不是,我将只使用 habtm 并将 completer_id 添加到项目表中,无论如何,住在那里是有意义的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多