# Selecting a model

**URL:** <https://www.ruby-forum.com/t/selecting-a-model/92980>\
**Category:** Rails\
**Created:** [April 26, 2007, 9:11am UTC](https://www.ruby-forum.com/t/selecting-a-model/92980 "2007-04-26T09:11:06Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![mike](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/58f4c7/32.png) [@mike](https://www.ruby-forum.com/u/mike)\
**Post date:** [April 26, 2007, 9:11am UTC](https://www.ruby-forum.com/t/selecting-a-model/92980/1 "2007-04-26T09:11:06Z")

</div>

I have three models: Language, Country and City.

A country has a Language and a language belongs to many countries.  
A country has many cities and a city belongs to a country.

When I use Active(Scaffold) and I want to edit/insert a City, I must  
select a Country. Is possible that when I must select a country, in the  
list of countries appear the Country + the language.

For example:

USA-English  
France-French  
England-English  
…

instead of:

USA  
France  
England  
…

Thanks.

---

<div class="post-metadata">

**Author:** ![mike](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/58f4c7/32.png) [@mike](https://www.ruby-forum.com/u/mike)\
**Post date:** [April 26, 2007, 10:58am UTC](https://www.ruby-forum.com/t/selecting-a-model/92980/2 "2007-04-26T10:58:27Z")

</div>

Sure, I assume you do a query for the countries -\> @countries =  
Country.find  
(:all)

for starters do this  
@countries = Country.find(:all, :include =\> ‘languages’) which will get  
the  
languages in the same query.

Now, in the select you have options\_for\_select=[array] so you have to  
build  
an array that looks like this [“USA -  
English”,“France-French”,“England-English”,…]

I would suggest that you create a helper method

def country\_options(country\_array)  
reponse\_array = []  
country\_array.each do |country|  
response\_array \<\< country.name + " - " + country.language.name  
end  
return reponse\_array  
end

reponse array wil now look like this [“USA -  
English”,“France-French”,“England-English”,…]

so you can do \<%= select\_tag(:country,  
options\_for\_select(country\_options(@countries))) %\> and that will give  
you  
the select you wanted.

---

<div class="post-metadata">

**Author:** ![mike](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/58f4c7/32.png) [@mike](https://www.ruby-forum.com/u/mike)\
**Post date:** [April 26, 2007, 1:25pm UTC](https://www.ruby-forum.com/t/selecting-a-model/92980/3 "2007-04-26T13:25:53Z")

</div>

Hi –

On 4/26/07, Ivor P. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Sure, I assume you do a query for the countries → @countries =  
> Country.find(:all)
> 
> for starters do this  
> @countries = Country.find(:all, :include =\> ‘languages’) which will get the  
> languages in the same query.
> 
> Now, in the select you have options\_for\_select=[array] so you have to build  
> an array that looks like this [“USA -  
> English”,“France-French”,“England-English”,…]

I believe you’d actually need something like:

[[“USA-English”, “USA”], [“France-French”, “French”], … ]

so that you’re providing both a label and a value for each option.

> I would suggest that you create a helper method
> 
> def country\_options(country\_array)  
> reponse\_array = []  
> country\_array.each do |country|  
> response\_array \<\< country.name + " - " + country.language.name  
> end  
> return reponse\_array  
> end

You’ve just reimplemented map 🙂 You can let Ruby do more of the  
work (untested):

def country\_options(countries)  
countries.map do |country|  
[country.name + ‘-’ + country.language.name, country.name]  
end  
end

You could also use country.id instead of country.name for the value,  
which might make it slightly easier to pull the record later.

David

–  
Upcoming Rails training by Ruby Power and Light:  
Four-day Intro to Intermediate  
May 8-11, 2007  
Edison, NJ  
[http://www.rubypal.com/events/05082007](http://www.rubypal.com/events/05082007)

---

<div class="post-metadata">

**Author:** ![mike](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/58f4c7/32.png) [@mike](https://www.ruby-forum.com/u/mike)\
**Post date:** [April 26, 2007, 2:04pm UTC](https://www.ruby-forum.com/t/selecting-a-model/92980/4 "2007-04-26T14:04:23Z")

</div>

Thanks David.

Yes, I should have done the [text\_value,id] - forgot about that 🙂

map! nice, yeah, thanks for the tip. So map creates an array populated  
with  
the result of the block for each element in the array that is being  
mapped?  
the result is then the array containing the results for each of the  
original  
elements.

thanks again

Ivor
