2011-10-27 7 views
2

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つ(continuousstandard)からのロジックはで、私は避けたいのですが何である、第三内で重複しています

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

...ただし、名前付きスコープを参照するためのSqueel DSLで正しい構文が見つかりません。

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

答えて

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

関連する問題