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