En la última semana tuve que trabajar con maquinas de estado y probe el plugin de acts_as_state_machine y la verdad es una maravilla. Este plugin nos permite definir una serie de estados para un objeto junto con las transicciones de los estados. Cada estado lleva asociados tres tipos de callbacks en tres momentos temporales:
1 2 3 | :enter => Proc.new { |bar| foo } #antes de entrar al estado. :after => Proc.new { |bar| foo } #después de entrar al estado. :exit => Proc.new { |bar| foo } #al salir del estado. |
El uso del plugin es bastante sencillo. Empezamo con la instalación:
1 2 | $ script/plugin install / http://elitists.textdriven.com/svn/plugins/acts_as_state_machine |
Una vez instalado solo tenemos que definir el modelo de la siguiente manera (para no liarlo mucho solo pondré los elementos realcionados con el plugin):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Ticket << ActiveRecord::Base acts_as_state_machine :initial => :opened state :opened, :enter => Proc.new { #Validates something } state :asigned, :after => Proc.new { #Add to TODO } state :closed, :exit => Proc.new { #Audit ticket } event :asig do transitions :from => :opened, :to => :asigned end event :close do transitions :from => :opend, :to => :closed transitions :from => :asigned, :to => :closed end end |
Con esto nos creariamos una clase Ticket con tres estados, opened, asigned y closed. Los eventos son los encargados de desencadenan las transiciones entre los estados.
Una vez en el controlador podríamos hacer:
1 | @ticket.close! |
y el estado de la incidencía pasa a cerrado.
En la base de datos el campo por defecto que Act_as_state_machine usa es el state que podeís modificarlos usando :column como opción. Ahora queda trastear. espero que os ayude en algo.
Saludos.
Referencias:
acts_as_state_machine en Agil Web Development