文字のグレードで並べ替えることはできますか? [閉まっている]
概要
レターグレードで並べ替えたいテーブルがあります。問題は、記号を含む文字の前に文字が並べ替えられることです。たとえば、A、A+、A-、B、B+、B-などのように並べ替えますが、A+、A、A-、B+、B、B-などのように並べ替えたいのですが、方法はありますか?これを設定するには?
解決策
アイデアとして、成績の最後の文字を確認し、その値に応じて成績に数値を追加することができます
モデルにスコープを追加できます
scope :order_by_grade, -> do
sql = <<~SQL
CASE RIGHT(grade, 1)
WHEN '-' THEN grade || 3
WHEN '+' THEN grade || 1
ELSE grade || 2
END
SQL
order(sql)
end
そして、モデルに適用します。 Work.order_by_grade
別のアイデアとして、すべてのバリアントを含むモデルに定数を定義し、インデックスを使用することもできます。
そして、ASC として最悪から最高へ、DESC として最高から最悪へ並べ替えるほうが良いかもしれません – それはあなたの選択です
GRADES = %w[A+ A A- B+ ...]
scope :order_by_grade, -> do
sql = 'CASE grade '
GRADES.reverse_each.with_index do |grade, index|
sql << sanitize_sql_array(['WHEN ? THEN ?', grade, index])
end
sql << ' END'
order(sql)
end
そして、モデル Work.order_by_grade または Work.order_by_grade.reverse_order に適用します。