Ruby Sequel中的默认\u范围
在ActiveRecord中有一个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 (`
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!