Rails - 将find_by结果迭代到选择下拉列表中

时间:2010-09-17 17:29:18

标签: ruby-on-rails

我是rails的新手,需要一些帮助来迭代sql结果。

我的模型中有一个使用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

这就是我在视图中所拥有的:

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

然后我得到了这个尴尬的#&lt; CountryTable:0x30509bc&gt;而不是为源中的每个选择选项显示的国家/地区名称:

<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>

我对rails很陌生,我甚至可能不会这样做。

1 个答案:

答案 0 :(得分:0)

即使在find语句中放入:select语句,它仍将返回模型类(CountryTable)的对象。您需要从对象中提取country_name属性。

通过转换每个对象来转换对象数组的最佳方法是使用map

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

这会传递find_all_by_country_status返回到该区块的每个国家/地区。该块依次返回该国家/地区的国家/地区名称。然后map将这些结果组合成一个新数组,该方法返回该结果。

作为旁注,模型的名称应该只是“Country”,而不是“CountryTable”。在Rails中,模型以它们所代表的对象命名。因此,如果您的模型是“国家/地区”,则每个对象(模型的数据库表中的每一行)代表一个国家/地区。