Rails 在关联查询时跳过 default_scope

Vij*_*min 2 ruby-on-rails

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

例如

class User < ActiveRecord::Base
  default_scope do
   where("type != 'guest'")
  end
end
Run Code Online (Sandbox Code Playgroud)

查询就像关联一样

例如

p = Product.last
p.users.where("...")
Run Code Online (Sandbox Code Playgroud)

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

max*_*max 5

不要使用default_scope. 它会从后面咬你。

删除作用域的唯一方法default_scope是使用unscoped它,正如您现在所了解的那样,删除所有作用域 - 而不仅仅是default_scope.

所以p.users.unscoped == User.all.unscoped

虽然你可以这样做:

User.unscoped.where(product: p) 
Run Code Online (Sandbox Code Playgroud)

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

相反,default_scope您应该使用显式范围:

class User < ApplicationRecord
  scope :not_guest, ->{ where.not(type: 'guest') }
end
Run Code Online (Sandbox Code Playgroud)

您还应该小心列名type,除非您将其用于单表继承 (STI)。ActiveRecord 使用它来确定类从数据库结果实例化是否可能导致意外错误。如果您想使用该列名称,请确保将继承列设置为其他名称:

class User < ApplicationRecord
  self.inheritance_column = :not_type
end
Run Code Online (Sandbox Code Playgroud)