如何在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,但它获取所有用户(不仅与产品相关)
不要使用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)