Ruby on Rails 4:采用哈希结果

Luc*_*fen 18 ruby ruby-on-rails-4

我怎么能转:

Person.all.pluck(:id, :name)
Run Code Online (Sandbox Code Playgroud)

[{id: 1, name: 'joe'}, {id: 2, name: 'martin'}]
Run Code Online (Sandbox Code Playgroud)

不必.map每个值(因为当我从.pluck添加或删除时,我必须与.map相同)

Pas*_*cal 26

你可以map得到结果:

Person.all.pluck(:id, :name).map { |id, name| {id: id, name: name}}
Run Code Online (Sandbox Code Playgroud)

如@alebian所述:这比效率更高

Person.all.as_json(only: [:id, :name])
Run Code Online (Sandbox Code Playgroud)

原因:

  • pluck只返回使用过的列(:id,:name),而另一个解决方案返回所有列.根据表格的宽度(列数),这会产生很大的不同
  • pluck解决方案不会实例化Person对象,也不需要为模型分配属性等等.相反,它只返回一个带有一个整数和一个字符串的数组.
  • as_json再次具有比简单更多的开销,map因为它是将模型转换为散列的通用实现


Roh*_*gid 26

你可以这么做

Person.select(:id,:name).as_json
Run Code Online (Sandbox Code Playgroud)

你也可以尝试一下

Person.all.as_json(only: [:id, :name])
Run Code Online (Sandbox Code Playgroud)

  • pascal betz的反应远比这个更有效.这个基本上在SQL查询结果之后创建N Person对象,并迭代它们以返回JSON.pluck + map版本遍历查询结果并创建哈希对象.一个简单的基准测试可以验证这一点,在我的机器上,1000个测试的结果为as_json版本(所有运行)返回395.65秒,而对于pluck + map版本(所有运行)只返回26.63秒,我的数据库有2.2k行 (4认同)
  • 提供的两种可能性并不相同,因为第一种将id添加到哈希中,即使没有要求例如Person.select(:name).as_json返回```[{id:nil,name:'joe' },{id:nil,name:'martin'}]```而Person.all.as_json(仅:[:name])返回```[{name:'joe'},{name:'martin' ```所以对于你不想要id的更一般情况,第二种方法更好. (3认同)

spi*_*ann 10

我看到三个选择:

1) pluckmap:

Person.pluck(:id, :name).map { |p| { id: p[0], name: p[1] } }
Run Code Online (Sandbox Code Playgroud)

2) pluck加上map加号zip和变量使其成为干燥器:

attrs = %w(id name)
Person.pluck(*attrs).map { |p| attrs.zip(p).to_h }
Run Code Online (Sandbox Code Playgroud)

3)或者你可能根本不使用pluck,尽管性能要差得多:

Person.all.map { |p| p.slice(:id, :name) }
Run Code Online (Sandbox Code Playgroud)


mni*_*chi 7

如果你使用postgresql,你可以使用json_build_objectpluck方法中的函数:https: //www.postgresql.org/docs/9.5/functions-json.html

这样,你可以让db创建哈希.

Person.pluck("json_build_object('id', id, 'name', name)")
#=> [{id: 1, name: 'joe'}, {id: 2, name: 'martin'}]
Run Code Online (Sandbox Code Playgroud)


MTa*_*ini 5

可以在 pluck 后以 ID 为键和 Name 为值进行散列:

Person.all.pluck(:id, :name).to_h

{ 1 => 'joe', 2 => 'martin' }
Run Code Online (Sandbox Code Playgroud)

不确定这是否符合您的需求,但作为一个选项呈现。

  • 我明白。一切都取决于你用它做什么。有时您更改数据以适应执行,有时您更改执行以适应数据。 (3认同)