0

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

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

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

4

1 回答 1

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辅助方法仅使用您想要的字段(通过使用模型中的新方法)进行选择,但在哈希数组中仍然有latand字段。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 回答