3

このクエリがあります

= f.select(:city, Country.where(:country_code => "es").collect(&:cities) {|p| [ p.city, p.id ] }, {:include_blank => 'Choose your city'})

問題は、次のエラーが表示されることです

SyntaxError: (irb):26: both block arg and actual block given

私が見たところcollect(&:cities)、ブロックを含めてから宣言することで、何か間違ったことをしています。同じクエリで両方を達成できる方法はありますか?

4

1 に答える 1

8
Country.where(:country_code => "es").collect(&:cities)

とまったく同じです

Country.where(:country_code => "es").collect {|country| country.cities}

これがエラーが発生する理由ですcollect。メソッドに 2 つのブロックを渡します。あなたが実際に意味したことは、おそらく次のようなものでした:

Country.where(:country_code => "es").collect(&:cities).flatten.collect {|p| [ p.city, p.id ] }

これにより、国が取得され、各国の都市のリストが取得され、配列が 1 次元のみになるように平坦化され、選択の配列が返されます。

国コードごとに国はおそらく 1 つしかないため、次のように記述することもできます。

Country.where(:country_code => "es").first.cities.collect {|p| [ p.city, p.id ] }
于 2012-04-23T21:07:52.163 に答える