2010-09-17 22 views
0

Je suis nouveau sur les rails et ont besoin d'aide itérer un résultat sql.Rails - résultats de Iterate dans un menu déroulant, sélectionnez

J'ai une méthode dans mon modèle qui utilise find_by:

def self.find_country() 
    @countries = CountryTable.find_all_by_country_status('Y', :select => "country_name") 
    @countries.each do |c| 
    puts "#{c.inspect}" 
    end 
end 

C'est ce que j'ai dans la vue:

<%= select_tag "country", options_for_select(CountryTable.find_country) %> 

Puis-je obtenir ce maladroit # < CountryTable: 0x30509bc > place du nom du pays indiqué pour chaque option de sélection dans la source:

<option value="#&lt;CountryTable:0x30509bc&gt;">#&lt;CountryTable:0x30509bc&gt;</option> 
<option value="#&lt;CountryTable:0x3050944&gt;">#&lt;CountryTable:0x3050944&gt;</option> 
<option value="#&lt;CountryTable:0x30508e0&gt;">#&lt;CountryTable:0x30508e0&gt;</option> 

Je suis si novice en ce qui concerne les rails que je ne vais probablement pas y arriver.

Répondre

0

Même si vous mettez une: instruction select dans la déclaration de trouver il retournera encore des objets de la classe modèle (CountryTable). Vous devez extraire les attributs country_name des objets.

La meilleure façon de convertir un tableau d'objets en convertissant chaque objet est d'utiliser map:

def self.find_country 
    find_all_by_country_status('Y', :select => "country_name").map {|c| c.country_name } 
end 

Cela passe chaque pays find_all_by_country_status retourne au bloc. Le bloc renvoie à son tour le nom du pays du pays. Puis map combine ces résultats dans un nouveau tableau et la méthode renvoie cela.

Comme une note de côté, le nom de votre modèle devrait probablement être juste « Pays », pas « CountryTable ». Dans Rails, les modèles portent le nom des objets qu'ils représentent. Donc, si votre modèle est "Pays", chaque objet (chaque ligne dans la table de base de données du modèle) représente un pays.

+0

Merci mckeed, qui a parfaitement fonctionné! – oprogfrogo