Ruby Sequel中的默认\u范围

Ruby Sequel中的默认\u范围,ruby,activerecord,sequel,default-scope,Ruby,Activerecord,Sequel,Default Scope,在ActiveRecord中有一个default\u scopeclass方法来指定默认范围。比如说 class User < ActiveRecord::Base default_scope where(:deleted => false) end User.all # => SELECT * FROM users WHERE deleted = 0; 生成的查询如下所示: User.all # => SELECT * FROM `users` WHERE (`

在ActiveRecord中有一个
default\u scope
class方法来指定默认范围。比如说

class User < ActiveRecord::Base
  default_scope where(:deleted => false)
end

User.all # => SELECT * FROM users WHERE deleted = 0;
生成的查询如下所示:

User.all # => SELECT * FROM `users` WHERE (`deleted` IS FALSE)
顺便说一句:
unscoped
的等价物是
unfiltered

User.unfiltered.all # => SELECT * FROM `users`
但是,有一个问题。如果您试图更新从未过滤数据集中获得的用户,它将尝试使用给定数据集更新该用户

User.create(disabled: true, deleted: true)
User.all # => []
u = User.unfiltered.first # => Given user
u.disabled = false
u.save # => UPDATE users SET ... WHERE (disabled IS FALSE AND id = 1)
# => Sequel::NoExistingObject: Attempt to update object did not result in a single row modification

所以我回到了开头。有什么解决方法吗?

最好的解决方法是通过没有默认作用域来避免问题。在大多数情况下,默认范围是个坏主意。如果希望大多数查询使用范围,则在这些查询中手动应用范围,不要使用默认范围,并尝试在其他查询中退出范围。只有当所有查询都将使用该范围时,默认范围才有意义

您还可以通过子类化(User不受作用域限制,ActiveUser 综上所述,如果您真的想使用默认范围,以下内容可以解决更新模型默认范围之外的模型实例的问题:

User.instance_dataset.unfiltered!
User.instance_dataset.unfiltered!