3

私はテーブルを持っています

Roles(id int,,name vachar(50),role enum(CAD,CA,CM,CV ))

特定の順序で特定の値で並べ替えるデータを選択したい。私のアクティブなモデル クエリ: role.order('role asc') 次に結果:

1 name1 CAD
2 name2 CA
3 name2 CM

しかし、私は次のような結果が欲しい:

1 name1 CAD
2 name2 CM
3 name2 CA

誰でも私を助けることができますか?前もって感謝します

4

1 に答える 1

6

移植可能な解決策は、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"))

すべての文字列操作は少し見にくいですが、完全に安全であり、通常はスコープ内に隠します。

于 2013-10-04T04:23:31.570 に答える