移植可能な解決策は、CASE ステートメントを ORDER BY のインライン マップとして使用することです。
query.order(%q(
case role
when 'CAD' then 1
when 'CM' then 2
when 'CA' then 3
end
))
任意の式で ORDER BY を実行でき、CASE は確かに SQL の式であることに注意してください。
Rails の新しいバージョンでArel.sql
は、生の文字列ではなく、次のように使用する必要があります。
query.order(
Arel.sql(
%q(
case role
when 'CAD' then 1
when 'CM' then 2
when 'CA' then 3
end
)
)
)
リストが動的な場合は、CASE 式を作成できます。
array = %w[CAD CM CA]
q = connection.method(:quote) # Or ApplicationRecord.connection.method(:quote)
cases = array.each_with_index.map { |e, i| "when #{q[e]} then #{i}" }
query.order(Arel.sql("case role #{cases.join(' ')} end"))
すべての文字列操作は少し見にくいですが、完全に安全であり、通常はスコープ内に隠します。