2013-09-06 12 views
7

Mam tabelę events z kolumną state. Jeśli wszystko pójdzie zgodnie z planem, państwa może być tylko jedna:Postgres: Sortuj według ciągu znaków ze znanymi wartościami

  • scheduled
  • invited
  • notified
  • started
  • ended

Czy można zamówić przez state i określ, która wartość zostanie uruchomiona t, drugi, trzeci itd ...?

Punkty bonusowe: Czy można w łatwy sposób to zrobić w Rails 3?

Odpowiedz

12

1.If wystarczy SQL w PostgreSQL, tutaj jest:

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)  

można zmienić kolejność stanów SQL, nie ma potrzeby zmiany kodu ruby, odgrywają skrzypce sql: http://sqlfiddle.com/#!12/976e9/3 .

2. W sugestii mu można użyć typu wyliczeniowego, jest to bardziej efektywne, jeśli trzeba zmienić kolejność, można odtworzyć wyliczenie. zobaczyć ten sql skrzypce: 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 czysty rubinowy sposób można zdefiniować skrót:

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 moim zdaniem, należy dodać tabelę o nazwie "stany", z kolumnami "nazwa" i "sekwencja" i określ kolejność w "sekwencji". Dołącz do "wydarzeń" i "stanów". Po zmianie kolejności nie trzeba zmieniać kodu.

+3

Można również użyć typu 'enum' w PostgreSQL, sortują sensownie. OTOH, starając się, aby AR grało ładnie z "enum" może być więcej pracy niż jest warte. –

+0

Tak, masz rację, niewiele wiem o 'enum', spróbowałem i dodałem twoją sugestię do odpowiedzi, czy rozumiem poprawnie? Jeśli coś jest nie tak. proszę wskazać, dziękuję :) – Bigxiang

+0

["Kolejność wartości w typie wyliczeniowym to kolejność, w jakiej wartości zostały podane, gdy typ został utworzony."] (http://www.postgresql.org/docs/ current/static/datatype-enum.html # AEN6387) Więc, tak, to, co masz, to inna opcja. Ale nie jestem pewien, jak dobrze ActiveRecord będzie z tym grał. –

Powiązane problemy