【发布时间】:2012-07-26 13:00:32
【问题描述】:
在 ActiveRecord 中有一个 default_scope 类方法来指定默认范围。例如
class User < ActiveRecord::Base
default_scope where(:deleted => false)
end
User.all # => SELECT * FROM users WHERE deleted = 0;
如何在Sequel::Model 中执行此操作?
编辑:
经过一番谷歌搜索,我终于找到了一些有用的信息。
class User < Sequel::Model
# Define some "scopes" (filters on the dataset)
dataset_module do
def existing
filter(deleted: false)
end
def active
filter(disabled: false)
end
end
# This is the equivalent to a default_scope. Set one of the datasets
# as the default dataset for this model.
set_dataset(self.active)
end
生成的查询如下所示:
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
所以我又回到了起点。有什么解决方法吗?
【问题讨论】:
标签: ruby activerecord sequel default-scope