在Squeal中引用命名范围的语法是什么?

时间:2011-10-27 22:13:18

标签: ruby-on-rails-3 squeel

有没有办法,使用Squeel来引用现有的范围?

请考虑以下事项:

scope :continuous, where{ job_type_id == 1 }
scope :standard, where{ job_type_id == 2 }

scope :active, where{ (job_status_id == 2) & ((job_type_id == 1) | ((job_type_id == 2) & (date_start > Time.now) & (date_end < Time.now))) }

所有三个范围都正常工作,但前两个范围内的逻辑(continuousstandard)在第三个范围内重复,这是我想要避免的,通过执行以下操作:

scope :active, where{ (job_status_id == 2) & (continuous | (standard & (date_start > Time.now) & (date_end < Time.now))) }

...除了我在Squeel DSL中找不到正确的语法来引用命名范围。

有没有办法做我想做的事情,或者我只需要明确吗?

1 个答案:

答案 0 :(得分:2)

Squeel目前不支持引用命名范围。首选方法是使用Squeel筛子,然后使用范围中的筛子:

sifter :continuous { where{ job_type_id == 1 }}
sifter :standard   { where{ job_type_id == 2 }}

scope :continuous, -> { where{ sift(:continuous) }}
scope :standard,   -> { where{ sift(:standard) }}
scope :active,     -> { where{ (job_status_id == 2) & (sift(:continuous) | (sift(:standard) & (date_start > Time.now) & (date_end < Time.now)) }}

显然仍然有些重复,可能不是最好的例子或用法,只是想展示如何用它们来实现你的例子。

参考筛选器:https://github.com/ernie/squeel#sifters