如何取消联接/ eager_load中的default_scope?

Ant*_*ton 5 ruby activerecord ruby-on-rails

我有两个模型:

class User
  default_scope -> { where(deleted_at: nil) }
end

class Order 
  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

我想获得已删除或未删除用户的订单:

Order.joins(:user).merge(User.unscoped)
Order.joins(:user).merge(User.unscope(where: :deleted_at))
# SELECT  "orders".* FROM "orders" 
# INNER JOIN "users" ON "users"."id" = "orders"."user_id" AND "users"."deleted_at" IS NULL 
# ORDER BY "orders"."id" DESC LIMIT 1

Order.eager_load(:user).merge(User.unscoped)
Order.eager_load(:user).merge(User.unscope(where: :deleted_at))
# SELECT  "orders"."id" AS t0_r0, "orders"."user_id" AS t0_r1, 
# "users"."id" AS t1_r0, "users"."deleted_at" AS t1_r1 FROM "orders" 
# LEFT OUTER JOIN "users" ON "users"."id" = "orders"."user_id" AND "users"."deleted_at" IS NULL 
# ORDER BY "orders"."id" DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)

这些都不起作用。

每个查询都会在联接语句中添加“ AND“ users”。“ deleted_at” IS NULL“。

如果指定关联范围,则没有任何变化:

class Order
  belongs_to :user, -> { unscoped } 
end
Run Code Online (Sandbox Code Playgroud)

但是包括预期的作品:

Order.includes(:user).merge(User.unscoped).last
# SELECT  "orders".* FROM "orders" ORDER BY "orders"."id" DESC LIMIT 1
# SELECT "users".* FROM "users" WHERE "users"."id" = 1054
Run Code Online (Sandbox Code Playgroud)

如何在连接中使Rails取消关联范围?

Ale*_*jin 3

你可以这样尝试。它适用于 Rails >= 3

User.unscoped { Order.joins(:user) }
Run Code Online (Sandbox Code Playgroud)