Forum: Ruby on Rails Selecting a model

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
34fe6bf8414be326f7bea83bfdb169b3?d=identicon&s=25 Mike (Guest)
on 2007-04-26 09:11
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.
Af9a9013100ddf2dbb0ca13487b60f8b?d=identicon&s=25 Ivor Paul (Guest)
on 2007-04-26 10:58
(Received via mailing list)
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.
1fba4539b6cafe2e60a2916fa184fc2f?d=identicon&s=25 David A. Black (Guest)
on 2007-04-26 13:25
(Received via mailing list)
Hi --

On 4/26/07, Ivor Paul <ivorpaul@gmail.com> 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
Af9a9013100ddf2dbb0ca13487b60f8b?d=identicon&s=25 Ivor Paul (Guest)
on 2007-04-26 14:04
(Received via mailing list)
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
This topic is locked and can not be replied to.