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

3つのスコープはすべて正しく機能しますが、最初の2つ(continuousおよびstandard)のロジックは3番目のスコープ内で複製されます。これは、次のようにすることで避けたいものです。

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

...名前付きスコープを参照するための正しい構文がSqueelDSLに見つからないことを除いて。

やりたいことをする方法はありますか、それとも明示的にする必要がありますか?

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 に答える