2

有没有办法使用 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 中找不到正确的语法来引用命名范围。

有没有办法做我想做的事,还是我只需要明确?

4

1 回答 1

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

于 2013-08-13T21:04:25.320 回答