Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails mongoid group_,返回哈希映射而不是哈希数组_Ruby On Rails_Ruby_Mongodb_Mongoid - Fatal编程技术网

Ruby on rails mongoid group_,返回哈希映射而不是哈希数组

Ruby on rails mongoid group_,返回哈希映射而不是哈希数组,ruby-on-rails,ruby,mongodb,mongoid,Ruby On Rails,Ruby,Mongodb,Mongoid,我想从mongoid组_中检索hashmap,而不是数组 Product.group_by {|p| p.user_id } 返回映射数组 result = Product.group_by {|p| p.user_id } => [ {"12354asdf" => [product1, product2, product3]}, {"safakjgh314" => [product4, product5, product6]} ] result.reduce Hash

我想从mongoid组_中检索hashmap,而不是数组

Product.group_by {|p| p.user_id }
返回映射数组

result = Product.group_by {|p| p.user_id } 

=> [ {"12354asdf" => [product1, product2, product3]},
{"safakjgh314" => [product4, product5, product6]} ]
result.reduce Hash.new, :merge
我目前正在对以下内容运行此查询的结果,以实现映射的单个散列

result = Product.group_by {|p| p.user_id } 

=> [ {"12354asdf" => [product1, product2, product3]},
{"safakjgh314" => [product4, product5, product6]} ]
result.reduce Hash.new, :merge
=>{“12354asdf”=>[product1、product2、product3], “safakjgh314”=>[product4、product5、product6]}

有没有更有效的方法

编辑*** 分组后,我宁愿使用一个有意义的可枚举项对集合进行操作

result.each do |k v| k v end
而不是

result.each do |h| h.keys.first, h.values.first end
它当前返回的内容的示例

[ 
  {user_object => [item1, item2, item3] },
  {user2_object => [item1, item2, item3] },
  {user2_object => [item1, item2, item3] }
]

关于迭代散列数组的更紧凑的方法,您可以先获取每个元素的

result.map(&:first).each do |k, v|
  puts k
  puts v.count
end
# 12354asdf
# 3
# safakjgh314
# 3

这里的方法基本上实现了MongoDB API中的方法。结果按设计以数组形式返回。即使是像
findOne
这样的操作,通常也会像代码一样包装标准方法。您希望如何提高效率?格式化的funky我在原始问题中添加了注释您已经有了答案,还需要什么?对不起,我在试着理解…我喜欢这个。这是在数组上迭代两次还是一次?我不知道你可以用。每个都有一个以上的块参数来迭代数组。。。[[“a”,“b”,“c”]]每个{数组元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素元素。您可以使用惰性枚举来强制它迭代一次(),但是性能开销比您在这个用例中可能获得的任何结果都要高。我不能肯定地说我的解决方案比
merge
更有效(我认为在一般情况下,数组的内存效率比哈希更高,并且两者都有
O(n)
时间复杂度),但它和
merge
解决方案一样高效,更简洁,更具ruby风格。