我正在尝试列出我的用户来自的独特城市及其国家/地区列表,如下所示:
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
但是如何将每个用户记录中的国家/地区名称添加到数组/哈希中,以便我可以按上面的方式构建我的列表?
答案 0 :(得分:1)
我认为应该这样做:
User.select("country, city").uniq
这应该返回一个User
个对象数组,其中只填充country
和city
。
然后你可以将它映射到你需要的东西,即:
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>
请参阅上面链接的帮助方法文档。