将ActiveRecord查询结果作为具有所选属性的哈希数组获取

时间:2016-07-08 13:50:03

标签: ruby-on-rails arrays ruby activerecord hash

模型User具有firstlastlogin作为属性。它还有一个名为name的方法,可以加入firstlast

我想要的是遍历Users记录并使用我想要的属性创建一个哈希数组。像这样:

results = []
User.all.map do |user|
    record = {}
    record["login"] = user.login
    record["name"] = user.name
    results << record
end

Ruby中有更清洁的方法吗?

4 个答案:

答案 0 :(得分:3)

尝试映射User.all会导致性能问题(稍后,如果不是现在)。要避免实例化所有User对象,可以使用pluck直接从数据库中获取数据,然后映射它。

results = User.all.pluck(:login, :first, :last).map do |login, first, last|
  { 'login' => login, 'name' => first << last }
end

实例化所有用户将会出现问题。即使是as_json关系方法也会这样做。使用此方法可能会出现问题,具体取决于有多少用户。

此外,这假定User#name确实只是first + last。如果它不同,您可以更改块中的逻辑。

答案 1 :(得分:2)

您可以使用ActiveRecord::QueryMethods#selectActiveRecord::Relation#as_json

User.select(:login, '(first || last) as name').as_json(except: :id)

答案 2 :(得分:1)

我会写:

results = User.all.map { |u| { login: u.login, name: u.name } }

答案 3 :(得分:0)

我认为,命名不佳且记录不良的方法ActiveRecord::Result#to_hash可以满足您的需求。

User.select(:login, :name).to_hash

命名不佳,因为它实际上确实返回了一个Hash数组,这对于一个名为to_hash的方法来说似乎很糟糕。