2013-09-06 14 views
7

Ich habe eine events Tabelle mit einer state Spalte. Wenn alles nach Plan geht, können die Staaten nur eines von:Postgres: Sortieren nach String-Spalte mit bekannten Werten

  • scheduled
  • invited
  • notified
  • started
  • ended

Ist es möglich, zu bestellen, indem state und spezifizieren, welcher Wert kommt Tannen t, zweite, dritte, etc ...?

Bonuspunkte: Gibt es eine Möglichkeit, dies einfach in Rails 3 zu tun?

Antwort

12

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.

+3

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. –

+0

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

+0

["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. –