有关联查询时,Rails跳过default_scope

时间:2018-12-06 07:39:15

标签: ruby-on-rails

在Rails控制台中查询时如何跳过default_scope

例如

class User < ActiveRecord::Base
  default_scope do
   where("type != 'guest'")
  end
end

查询与关联类似

例如

p = Product.last
p.users.where("...")

我需要为用户跳过default_scope。我尝试了p.users.unscoped,但是它获取了所有用户(不仅与产品相关联)

1 个答案:

答案 0 :(得分:1)

请勿使用$.。它会在后面咬你。

删除default_scope范围的唯一方法是使用default_scope,正如您现在所了解的,它会删除所有范围-不仅是unscoped

所以default_scope

您可以这样做:

p.users.unscoped == User.all.unscoped

那不允许您急于加载/包含关联以避免N + 1个查询。

您应该使用显式作用域代替User.unscoped.where(product: p)

default_scope

除非您将其用于单表继承(STI),否则还应避免使用列名class User < ApplicationRecord scope :not_guest, ->{ where.not(type: 'guest') } end 。 ActiveRecord在某些情况下会使用它来确定记录的类别,并可能导致意外的错误。