列のあるevents
テーブルがありstate
ます。すべてが計画どおりに進む場合、状態は次のいずれかになります。
scheduled
invited
notified
started
ended
state
どの値が 1 番目、2 番目、3 番目などに来るかを指定して並べ替えることはできますか?
ボーナスポイント: Rails 3 でこれを簡単に行う方法はありますか?
列のあるevents
テーブルがありstate
ます。すべてが計画どおりに進む場合、状態は次のいずれかになります。
scheduled
invited
notified
started
ended
state
どの値が 1 番目、2 番目、3 番目などに来るかを指定して並べ替えることはできますか?
ボーナスポイント: Rails 3 でこれを簡単に行う方法はありますか?
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」で順序を指定する必要があります。次に、「イベント」と「状態」を結合します。順序を変更する場合、コードを変更する必要はありません。