0

次のように、ユーザーの出身地である一意の都市とその国のリストを作成しようとしています。

United States - Boston
United States - New York
United States - San Francisco
United Kingdom - London
United Kingdom - Manchester
France - Paris
France - Lyon

(同じところからの利用者が多い)

(City と Country は、リバース ジオコーディングを使用して入力される User モデルの単なるフィールドです)

これを使用して、都市のリストを配列に取得できます

User.pluck(:city).uniq

しかし、各ユーザー レコードの国名を配列/ハッシュに追加して、上記のようにリストを作成するにはどうすればよいでしょうか?

4

1 に答える 1

1

私はこれがそれを行うべきだと思います:

User.select("country, city").uniq

これは、とのみが入力されたUserオブジェクトの配列を返す必要があります。次に、それを必要なものにマップできます。countrycity

User.select("country, city").uniq.map { |u| "#{u.country} - #{u.city}" }

例えば...

アップデート

コメントへの回答: はい、必要な緯度と経度のフィールドを次のように追加できます。

# remember afterwards to only access the fields you're actively selecting here,
# otherwise you'll get an exception
@users = User.select("country, city, lat, lng").uniq.map { |u| { country: u.country, city: u.city, lat: u.lat, lng: u.lng } }

User簡単に使用するために、必要に応じて文字列を返すメソッドをモデルに追加します。

def country_city
  "#{country} - #{city}"
end

ビューでは、collection_selectヘルパー メソッドを使用して、(モデルで新しいメソッドを使用して) 必要なフィールドのみを選択に使用できますが、ハッシュ配列にはフィールドlatとフィールドがあります。lng

collection_select(:name_of_view_instance, :name_of_select_field, @users, :id, :country_city)

これにより、次のような HTML 出力が得られます。

<select name="name_of_view_instance[name_of_select_field]">
  <option value="1" selected="selected">United States - Boston</option>
  <option value="2">United States - New York</option>
  <option value="3">United States - San Francisco</option>
  <!-- and so on -->
</select>

上記のリンクにあるヘルパー メソッドのドキュメントを参照してください。

于 2012-10-05T00:26:19.860 に答える