1

すべてのレコードに対して注文モデルを照会しようとしていますが、非常に特殊な方法で注文します。正規表現を使用して高度なアクティブレコードの順序

データベースは、PostgreSQLデータベースです。

NYで始まるすべてのレコードを最初に、NYNとし、残りのすべてのレコードを続けます。

私はこのような何かをやろうとしていると思う:

Order.all.order('order_number /^NY/, /^NYN/') 

データの例:

NY-1111111 
NYN-1234567 
P-000000 
P0000000 
SS0232131 
NYN16151202 

私が欲しい順序は次のとおりです。

NY-1111111 
NYN16151202 
NYN-1234567 
P0000000 
P-000000 
SS0232131 

答えて

3

は一つの方法ですSQLでこれを行うかもしれません:

SELECT * FROM orders 
    ORDER BY 
    CASE 
     WHEN order_number LIKE 'NYN%' THEN 1 
     WHEN order_number LIKE 'NY%' THEN 0 
     ELSE 2 
    END, 
    order_number; 

これは、ActiveRecordのクエリにかなり直接翻訳することができます。

Order.order(" 
    CASE 
    WHEN order_number LIKE 'NYN%' THEN 1 
    WHEN order_number LIKE 'NY%' THEN 0 
    ELSE 2 
    END, 
    order_number 
") 

ここでは、PostgreSQLのPOSIX正規表現を使用して、別の可能性があります。私はそれが上記のパフォーマンスとどのように比較されているか分かりません。

Order.order(" 
    CASE SUBSTRING(order_number FROM '^NYN?') 
    WHEN 'NY' THEN 0 
    WHEN 'NYN' THEN 1 
    ELSE 2 
    END, 
    order_number 
") 
+0

plus 1 ..本当に素敵で効率的な答えです。) –

+0

効率的で*正しい。その第二部は時には重要なものです;) –

+0

fantastic @jordan。どうもありがとうございました。これははるかに効率的で完璧に動作します。 –

2

ruby sort_byメソッドでこれを行うことができます:

orders = Order.all.sort_by{ | order | 
    if order.name =~ /^NYN/ 
     -1; 
    elsif order.name =~ /^NY/ 
     -2; 
    else 
     0; 
    end 
} 

順序名があるのであれば:["ghi", "NYabc", "jk", "NYNdef"]、順序は次のようになります。["NYabc", "NYNdef", "ghi", "jk"]または["NYabc", "NYNdef", "jk", "ghi"]

あなたはsort_by here

のドキュメントを見つけることができ、それがお役に立てば幸いです。)ここで

+0

あなたの答えはありがとう。それは私が行くことをしようとしているものに近い超です。私の問題は、ActiveRecordクエリを使用してクエリを試してみたかった理由で、配列ではなくActiveRecordオブジェクトに戻り値を必要とすることです。 –

+0

ありがとうございます。感謝します!!!よく働く。 –

+0

@VinnyAlfieriようこそ。それは助けて嬉しいです:) –

関連する問題