Rails:获取城市独特的用户的国家(或任何其他)属性'

时间:2012-10-05 00:15:37

标签: ruby-on-rails arrays activerecord hash

我正在尝试列出我的用户来自的独特城市及其国家/地区列表,如下所示:

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

(有很多用户来自同一个地方)

(城市和国家/地区只是用户模型中使用反向地理编码填充的字段)

我可以使用此

将城市列表放入数组中
User.pluck(:city).uniq

但是如何将每个用户记录中的国家/地区名称添加到数组/哈希中,以便我可以按上面的方式构建我的列表?

1 个答案:

答案 0 :(得分:1)

我认为应该这样做:

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

这应该返回一个User个对象数组,其中只填充countrycity。 然后你可以将它映射到你需要的东西,即:

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

......

<强>更新

回答你的评论: 是的,您只需添加所需的lat和lng字段即可:

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

请参阅上面链接的帮助方法文档。