如何在Sequel中实现类似Rails scope的链式查询功能
在Sequel中实现类似Rails Scope的链式查询功能
要在Sequel里实现和Rails scope一致的链式调用效果,核心是要保证方法始终返回Dataset对象(而非数组)——因为Sequel的all会立即执行查询并返回数组,而数组不支持链式的查询方法(比如order、where)。
修正后的代码
class MyClass < Sequel::Model dataset_module do def my_filter(condition) # 条件有效时添加where子句,否则返回当前数据集 condition.present? ? where(condition: condition) : self end end end
用法说明
和Rails的调用方式完全一致,无论condition是否为空,都能正常链式调用后续方法:
MyClass.where(foo: 'foo').my_filter(condition).order(:date)
关键原理
- Sequel的
dataset_module中定义的方法,默认的self就是当前的Dataset实例(类似Rails的ActiveRecord::Relation),它是延迟执行的查询对象,支持所有链式查询方法。 - 当条件不满足时返回
self,相当于直接传递原数据集,不会中断链式调用;条件满足时返回where后的新Dataset,同样保持链式能力。
内容的提问来源于stack exchange,提问作者ironsand
相关产品推荐
相关产品推荐

