12

列のあるeventsテーブルがありstateます。すべてが計画どおりに進む場合、状態は次のいずれかになります。

  • scheduled
  • invited
  • notified
  • started
  • ended

stateどの値が 1 番目、2 番目、3 番目などに来るかを指定して並べ替えることはできますか?

ボーナスポイント: Rails 3 でこれを簡単に行う方法はありますか?

4

1 に答える 1

29

1.PostgresでSQLが必要な場合は、次のとおりです。

select * from events
order by (case state 
          when 'scheduled' then 1
          when 'notified' then 2
          when 'invited' then 3
          when 'started' then 4
          when 'ended' then 5 
          end)    

SQL の状態の順序を変更できます。Ruby コードを変更する必要はありません。SQL フィドルを再生してください: http://sqlfiddle.com/#!12/976e9/3

2.muの提案では、列挙型を使用できます。より効率的です。順序を変更する必要がある場合は、列挙型を再作成できます。このSQLフィドルを参照してください:http://sqlfiddle.com/#!12/f6f3d/2

CREATE TYPE states AS ENUM ('invited', 'scheduled', 'notified', 'started', 'ended');
create table events(
  name varchar(100),
  state states
);

select * from events order by state;

3. 純粋な Ruby の方法では、ハッシュを定義できます。

test_hash = {'scheduled'=>1, 'notified'=>2, 'invited'=>3, 'started'=>4, 'ended'=>5}
Events.all.sort! {|x, y| test_hash[x.state] <=> test_hash[y.state]}

4.しかし、私の意見では、列「name」と「sequence」を持つ「states」という名前のテーブルを追加し、「sequence」で順序を指定する必要があります。次に、「イベント」と「状態」を結合します。順序を変更する場合、コードを変更する必要はありません。

于 2013-09-06T03:29:06.583 に答える