Squeel içindeki adlandırılmış kapsamlara başvurmak için sözdizimi nedir?

Mevcut kapsamlara başvurmak için Squeel kullanarak bir yol var mı?

Aşağıdakileri göz önünde bulundur:

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

Her üç kapsam da düzgün çalışır, ancak ilk ikisinden ( sürekli ve standart ) gelen mantık üçüncü sırada yinelenir. gibi bir şey:

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

... dışında Squeel DSL'de, adlandırılmış kapsamlara başvurmak için doğru sözdizimini bulamıyorum.

İstediğimi yapmanın bir yolu var mı yoksa açık bir şekilde mi olmalıyım?

2

1 cevap

Squeel şu anda adlandırılmış kapsamları referans olarak desteklemiyor. Tercih edilen yöntem Squeel elekleri kullanıyor ve daha sonra kapsamlarınızdaki elekleri kullanıyor:

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

Açıkçası hala bazı tekrarlar ve belki de en iyi örnek ya da kullanım değil, sadece sizin örneklerinizi nasıl uygulayacağınızı göstermek istedim.

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

2
katma