Techioz Blog

文字のグレードで並べ替えることはできますか? [閉まっている]

概要

レターグレードで並べ替えたいテーブルがあります。問題は、記号を含む文字の前に文字が並べ替えられることです。たとえば、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 に適用します。