I have an issue whereby I want the attributes on an object to be saved
in the db as simple integers and the corresponding labels to be stored
in the class.
DB Car:
id int, name varchar(10), speed int
Model Car:
class Car < ActiveRecord::Base
Speed = %w{Slow Normal Fast}
end
View Car:
<select name="mycar[speed]">
<option value=0>Slow</option>
<option value=1>Normal</option>
<option value=2>Fast</option>
</select>
What is the select statement to get the options to print out like that?
Now I know that I could set Speed to be a hash (Speed = {"slow"=>0,
"normal"=>1, "fast"=>2}) but then I would lose the
ordering, which is
important. I could use an associative array as well (Speed = [["Slow",
0],["Normal", 1],["Fast", 2]]) but this Car object will have
a number of
similar attributes so that would seem to violate the DRY principal
having to put 0, 1, 2, etc in every time.
Is there a way to print out a select statement using a simple
one-dimensional array with the item''s index value acting as the key in
the option tag?
I very much want to do this the Ruby way. Any help would be greatly
appreciated.
--
Posted via http://www.ruby-forum.com/.
Jeremy Evans
2005-Dec-06 23:46 UTC
Re: using one-dimensional arrays in select statements (noob)
On 12/6/05, sean <ruby-forum.com-QAFWIqWfQhF54TAoqtyWWQ@public.gmane.org> wrote:> What is the select statement to get the options to print out like that? > Now I know that I could set Speed to be a hash (Speed = {"slow"=>0, > "normal"=>1, "fast"=>2}) but then I would lose the ordering, which is > important. I could use an associative array as well (Speed = [["Slow", > 0],["Normal", 1],["Fast", 2]]) but this Car object will have a number of > similar attributes so that would seem to violate the DRY principal > having to put 0, 1, 2, etc in every time.There isn''t a method that does exactly what you want, as far as I know. But here''s an idea that is pretty good with regards to DRY: class Array def with_indexes a = [] each_with_index {|x,i| a << [x,i]} a end end Model Car: class Car < ActiveRecord::Base @@speeds = %w{Slow Normal Fast} cattr_reader :speeds end View Car: select("mycar", "speed", Car.speeds.with_indexes)
jeremyevans0 wrote:> > There isn''t a method that does exactly what you want, as far as I > know. But here''s an idea that is pretty good with regards to DRY: >That is an excellent solution, thanks very much for your input on what was a vexing issue. -- Posted via http://www.ruby-forum.com/.