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))) }

3つのスコープはすべて正常に動作しますが、最初の2つ(連続標準)のロジックは3回目に複製されます。何かのようなもの:

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

...名前付きスコープを参照するためのSqueel DSLで正しい構文が見つからない点を除いて。

私が好きなやり方をする方法はありますか、それとも明示する必要はありますか?

2

1 答え

Squeelは現在、名前付きスコープの参照をサポートしていません。推奨される方法は、Squeel siftersを使用して、スコープ内のsifterを使用することです。

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)) }}

明らかにまだいくつかの繰り返しがあり、おそらく最良の例や用法ではないかもしれませんが、それらを使ってあなたのサンプルを実装する方法を示したかっただけです。

Reference sifters: https://github.com/ernie/squeel#sifters

2
追加された