From: Paolo Negri Date: 2006-09-05T21:04:02+09:00 Subject: Re: Enum Hi adding some informations to your hash may help, something like.. { :hidden => {:id => 1, :label => 'Hidden'}, :available => {:id => 2, :label => 'Available'}, :in_progress => {:id => 3, :label => 'In progress'}, :complete => {:id => 4, :label => 'Complete' }} gives you an index to trust and next you can do something like (note, the code isn't checked so probably won't work as it is) statuses.each do |key, value| define_method(key.to_s + '?') { self.status == value[:id] } end to have all the hidden? available? etc. methods. Anyway I think that if you have a look to the rails humanize method you could avoid the label field so you can manage the statuses with a simple hash or even an array. Paolo On 05/09/06, Ohad Lutzky wrote: > I want an enum of sorts in my Rails application. > > I have a Project object, which has four possible status settings, as > indicated here: > > class Project < ActiveRecord:Base > ... > class << self > def statuses > [ 'Hidden', 'Available', 'In progress', 'Complete' ] > end > end > ... > end > > These are not expected to change, so hardcoding is preferable. Of > course, there is a 'status' column in the project table, so rails > creates a 'status' accessor. > > However, later in the code I will want to check the status myself. For > example, 'Complete' projects won't be shown in the same place as > 'Available' ones, and 'In progress' and 'Hidden' projects won't be shown > at all (not sure about In progress ATM though, so I want to keep it > flexible). Now, it would be pretty ugly checking > > if a_project.status == 2 # Project is in progress > > So one possibility is to add methods like > > class Project > def in_progress? > self.status == 2 > end > end > > Another interesting option is this: > > class Project > def status_is?(_status) > [ :hidden, :available, :in_progress, :complete ][self.status] == > _status > end > end > > If only I could count on hashes staying in order, a very pretty solution > would > be: > > class Project > class << self > def statuses > { :hidden => 'Hidden', :available => 'Available', > :in_progress => 'In progress', :complete => 'Complete' } > # Use Project.statuses.values for the dropdown > end > end > def status_is?(_status) > Project.statuses.keys[self.status] == _status > end > end > > Unfortunately, "The order in which you traverse a hash by either key or > value may seem arbitrary, and will generally not be in the insertion > order." (ri). > > Any other ideas for elegance? > > > -- > Posted via http://www.ruby-forum.com/. > >