Status zdarzenia

Witam

Zdarzenie może mieć 3 stany.
Czy lepiej użyć pola typu boolean do ich przechowywania i potem mieć stan: NULL FALSE i TRUE
Czy lepiej użyć pola typu integer i mieć stany 1 2 3?
Z którym sposobem przechowywania stanu będzie łatwiej się pracowało.
Jeśli zrobię boolean to dla pola status z wartością FALSE i TRUE
nil? będzie pokazywał false
natomiast
blank? będzie pokazywał true dla NIL i FALSE.

Jak potem testować pole status?
Można dać if status == nil, true, false ale wolę użyć status.blank?, startus.nil? itp.

Pozdrawiam

Zainteresuj się pluginem acts_as_state_machine

state_machine jest lepszy (jeśli potrzebujesz rozbudowane funkcjonalności).

A odpowiadając na Twoje pytanie: lepiesz użyć integera i mieć 1,2,3

Żeby jeszcze utrudnić wybór ciekawy jest Workflow:
http://github.com/geekq/workflow/tree/master

Zależy czy potrzebujesz w jakikolwiek sposób obsługiwać zmiany tych stanów. Jeśli tak - któryś z zaproponowanych pluginów będzie dobrym rozwiązaniem. Jeśli nie - jakaś forma tinyinta się sprawdzi, ale sugerowałbym stany, będące potęgami dwójki (łatwy sposób pozwają tworzyć kombinacje stanów, co teraz może nie być potrzebne, ale w przyszłości - owszem).

Ech, premature optimization. W każdej ze znanych mi aplikacji po jednej kolumnie tekstowej na typ stanu wystarcza. Silniki SQL są wystarczająco dobre w indeksowaniu, żeby bez zacięć obsłużyć query z kilkoma warunkami dotyczącymi dwóch lub więcej stanów, nawet jeśli stany opisane są tekstem.

Poświęcenie czytelności kodu (i schematu bazy) na rzecz niemierzalnego zysku w wydajności według mnie nie ma sensu.

Ja korzystałem ze state_machine i go polecam - bardzo wygodnie się go obsługuje.

Jeszcze dodałbym prostego checka na kolumnie ze stanem rekordu, niezależnie od tego czy to integer czy text, coś prostego jak check ( status in (1,2,3)), co pozwoli uniknąć takich kwiatków jak pojawienie się 18tys rekordów ze statusem 100, o którym nikt nie ma pojęcia. Oczywiście mówię, o sprawdzaniu tego po stronie bazy, bo sprawdzanie w modelach czasem nie jest wystarczające.