有没有办法,使用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))) }
所有三个范围都正常工作,但前两个范围内的逻辑(continuous
和standard
)在第三个范围内重复,这是我想要避免的,通过执行以下操作:
scope :active, where{ (job_status_id == 2) & (continuous | (standard & (date_start > Time.now) & (date_end < Time.now))) }
...除了我在Squeel DSL中找不到正确的语法来引用命名范围。
有没有办法做我想做的事情,或者我只需要明确吗?
答案 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)) }}
显然仍然有些重复,可能不是最好的例子或用法,只是想展示如何用它们来实现你的例子。