Каков синтаксис для ссылки на именованные области в 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))) }
Все три прицела работают нормально, но логика из первых двух (continuous
а также standard
) дублируются внутри третьего, чего я бы хотел избежать, выполнив что-то вроде:
scope :active, where{ (job_status_id == 2) & (continuous | (standard & (date_start > Time.now) & (date_end < Time.now))) }
... за исключением того, что я не могу найти правильный синтаксис в Squeel DSL для ссылки на именованные области.
Есть ли способ сделать то, что я хотел бы, или мне просто нужно быть явным?
1 ответ
В настоящее время 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