1. Wenn Sie nur eine SQL in postgres brauchen, hier ist sie:
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)
Sie die Reihenfolge der Zustände in SQL ändern können, keine Notwendigkeit, den Ruby-Code zu ändern, die SQL-Geige spielen: http://sqlfiddle.com/#!12/976e9/3 .
2.Mus Vorschlag, können Sie einen Enum-Typ verwenden, es ist effizienter, wenn Sie die Reihenfolge ändern müssen, können Sie die Enum neu erstellen. sehen diese SQL-Geige: 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.In reine Rubin Art und Weise, können Sie einen Hash definieren:
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.But meiner Meinung nach, sollten Sie eine Tabelle hinzufügen namens "Zustände", mit den Spalten "Name" und "Sequenz" und geben Sie die Reihenfolge in "Reihenfolge" an. Trete dann den "Ereignissen" und "Zuständen" bei. Wenn Sie die Reihenfolge ändern, müssen Sie den Code nicht ändern.
Sie könnten auch einen 'enum' Typ in PostgreSQL verwenden, sie sortieren sinnvoll. OTOH, der versucht, AR dazu zu bringen, mit einem 'enum' nett zu spielen, könnte mehr Arbeit sein, als es wert ist. –
Ja, du hast recht, ich weiß wenig über 'enum', ich habe es versucht und deinen Vorschlag der Antwort hinzugefügt, verstehe ich das richtig? Wenn etwas nicht stimmt. bitte zeigen Sie es, danke :) – Bigxiang
["Die Reihenfolge der Werte in einem Aufzählungstyp ist die Reihenfolge, in der die Werte aufgelistet wurden, als der Typ erstellt wurde."] (http://www.postgresql.org/docs/ current /static/datatype-enum.html # AEN6387) Also, ja, was Sie haben, ist eine andere Option. Aber ich bin nicht sicher, wie gut ActiveRecord damit spielen wird. –