Using store values from drop down list

Hi,

I was trying to understand stored values vs display values.

# model code

  CLUB_TYPES = [ # Displayed stored in db   [ "Public" , "pub" ],   [ "Village" , "vil" ],   [ "Private" , "pvt" ]   ]

  validates_inclusion_of :club_type, :in =>           CLUB_TYPES.map {|disp, value| value}

#view code

  <%= f.select :club_type, Club::CLUB_TYPES, :prompt => "Select a Club Type" %>

This works fine for getting data into the database.

My question: Is there a helper to get the display value back from the database? If not, could somebody show me how to correct the following to get the display value rather than the stored value.

  <b>Club Type:</b>   <%= @club.club_type %>

Thanks

model code

CLUB_TYPES = [

Displayed stored in db

[ “Public” , “pub” ],

[ “Village” , “vil” ],

[ “Private” , “pvt” ]

]

I would change that as follows:

CLUB_TYPES = {

“pub” => “Public”,

“vil” => “Village”,

“pvt” => “Private”

}

validates_inclusion_of :club_type, :in =>

      CLUB_TYPES.map {|disp, value| value}

So that becomes:

validates_inclusion_of :club_type, :in => CLUB_TYPES.keys

#view code

<%= f.select :club_type, Club::CLUB_TYPES, :prompt => "Select a Club

Type" %>

I think when using a hash you need to invert it, something like this:

<%= f.select :club_type, Club::CLUB_TYPES.invert, :prompt => "Select a Club

Type" %>

You may need to play with that a little bit… I can’t remember and don’t have time to test it at the second…

This works fine for getting data into the database.

My question: Is there a helper to get the display value back from the

database? If not, could somebody show me how to correct the following

to get the display value rather than the stored value. Club Type:

<%= @club.club_type %>

<%= Club::CLUB_TYPES[@club.club_type] %>

(or more likely a method on the model call club_type_description or something similar that does the same thing).

Cheers,

Andy

...as long as there's no need for clubtypes to be displayed in any particular order (arrays are returned in order, hashs aren't necessarily)

For the minuscule amount of extra effort involved, create a model for club types, seed it, and give it a "position" column if you want to manage the order (or just put an :order clause on your default finder).

Then use ClubType.all or named scopes for more functionality ...

Your clubs can change their club_type text column into a club_type_id integer and add a belongs_to relationship, allowing you to do nice easy queries, leverage Rails' functionality, and get rid of those "magic" array/hash variables.

Sometimes things that seem like shortcuts (like using an array for some "static" data) can quickly turn into dead ends. The framework does all the hard work for you, so you might as well use it.

Thanks for the advice. Changing to a hash did what I wanted it to.

I can see the advantage of generalizing this in a model. Thanks for the suggestion.