【问题标题】:Rails: Get Country (or any other) attribute of 'Users where city is unique'Rails:获取“城市唯一的用户”的国家(或任何其他)属性
【发布时间】:2012-10-05 00:15:37
【问题描述】:

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

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

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

【问题讨论】:

  • 你的模型和关系是如何建立的?
  • 我希望这里只有用户模型是相关的 - 国家和城市只是用户中的字段,使用地理编码器 gem 填充

标签: ruby-on-rails arrays activerecord hash


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

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>

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

【讨论】:

  • 有效,谢谢!是否可以将其他用户属性映射到哈希中,但他们不参与选择?例如经纬度坐标如下所示: User.order('country asc').select("country, city").uniq.map { |u| { 国家:u.country,城市:u.city,纬度:u.lat,lng:u.lng }} ?
猜你喜欢
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多