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),而另一个解决方案返回所有列.根据表格的宽度(列数),这会产生很大的不同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)
spi*_*ann 10
我看到三个选择:
1) pluck加map:
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)
如果你使用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)
可以在 pluck 后以 ID 为键和 Name 为值进行散列:
Person.all.pluck(:id, :name).to_h
{ 1 => 'joe', 2 => 'martin' }
Run Code Online (Sandbox Code Playgroud)
不确定这是否符合您的需求,但作为一个选项呈现。
| 归档时间: |
|
| 查看次数: |
13597 次 |
| 最近记录: |