【问题标题】:How to make a scope with a join work in Rails 5?如何在 Rails 5 中使用 join 工作?
【发布时间】:2020-12-07 02:24:23
【问题描述】:

我有以下模型和关联:

class Role < ApplicationRecord
  belongs_to :project
  has_many :collaborators, dependent: :destroy
  has_many :users, through: :collaborators

  scope :open_roles, -> { joins(:collaborators).where(role: { collaborator_id: nil })}
end

我希望能够调用 Role.open_roles 并检索所有未指定协作者的角色。

我使用的范围返回 0 个结果,我看到服务器端的查询不正确:

SELECT "roles".* FROM "roles" WHERE "roles"."id" IS NULL

我写的范围有什么问题?

【问题讨论】:

  • Joins 是一个代表“INNER join”,记录必须存在于两个表中。您需要执行“左连接”。在 Rails 5 中,您应该能够将 .joins 替换为 .left_outer_joins

标签: sql ruby-on-rails database scope


【解决方案1】:

使用 .left_outer_joins 代替 .joins

【讨论】:

    【解决方案2】:

    我将急切加载方法用于类似的用例。范围可以定义为

    scope :open_roles, -> { includes(:collaborators).where(collaborators: { id: nil }) }
    

    使用where 方法与includes implies LEFT OUTER JOIN 关联

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多