Rails按列分组并选择列

时间:2019-12-20 07:21:16

标签: ruby-on-rails ruby postgresql group-by

我有一个表DinnerItem,其中包含列ID,名称,project_id,client_id,item_id和item_quantity。

我想获取数据group_by item_id列,并且该值只能具有格式为

的item_quantity列值
{ item_id1 => [ {item_quantity from row1}, {item_quantity from row2}],
  item_id2 => [ {item_quantity from row3}, {item_quantity from row4} ]
}

如何在一个查询中实现?

OfferServiceModels::DinnerItem.all.select('item_id, item_quantity').group_by(&:item_id)

但这具有格式

 {1=>[#<DinnerItem id: nil, item_id: 1, item_quantity: nil>, #<DinnerItem id: nil, item_id: 1, item_quantity: {"50"=>30, "100"=>10}>], 4=>[#<DinnerItem id: nil, item_id: 4, item_quantity: {"100"=>5, "1000"=>2}>}

3 个答案:

答案 0 :(得分:2)

您可以保留查询和分组,但是将as_json附加到操作:

DinnerItem.select(:item_id, :item_quantity).group_by(&:item_id).as_json
# {"1"=>[{"id"=>nil, "item_id"=>1, "item_quantity"=>1}, {"id"=>nil, "item_id"=>1, "item_quantity"=>2}],
#  "2"=>[{"id"=>nil, "item_id"=>2, "item_quantity"=>1}, {"id"=>nil, "item_id"=>2, "item_quantity"=>2}]}

请注意,as_json将添加每行的ID(其值为nil)。

答案 1 :(得分:1)

我不知道如果不转换从数据库返回的值,这是不可能的。如果您能够对此进行转换,则可以使用以下方法为您提供所需的格式:

OfferServiceModels::DinnerItem.all.select('item_id, item_quantity').group_by(&:item_id)
                              .transform_values { |vals| vals.map(&:item_quantity) }
# => {"1"=>[nil,{"50"=>30, "100"=>10}],"4"=>...}

# or

OfferServiceModels::DinnerItem.all.select('item_id, item_quantity').group_by(&:item_id)
                              .transform_values { |vals| vals.map { |val| val.slice(:item_quantity) }
 # => {"1"=>[{:item_quantity=>nil},:item_quantity=>{"50"=>30, "100"=>10}}],"4"=>...}

我认为您直接从数据库接收到的输出没有问题。数据在那里,因此在需要时输出相关字段:通过上面的转换或在数据中进行迭代。

希望这会有所帮助,让我知道:)

答案 2 :(得分:1)

类似的事情应该可以完成:

result = OfferServiceModels::DinnerItem
  .pluck(:item_id, :item_quantity)
  .group_by(&:shift)
  .transform_values(&:flatten)
#=> {1 => [10, 20], 2 => [30, 40]}
#    ^ item id            ^^  ^^ item quantity

分步说明:

# retrieve the item_id and item_quantity for each record
result = OfferServiceModels::DinnerItem.pluck(:item_id, :item_quantity)
#=> [[1, 10] [1, 20], [2, 30], [2, 40]]
#     ^ item id           ^^ item quantity

# group the records by item id, removing the item id from the array
result = result.group_by(&:shift)
#=> {1 => [[10], [20]], 2 => [[30], [40]]}
#    ^ item id                 ^^    ^^ item quantity

# flatten the groups since we don't want double nested arrays
result = result.transform_values(&:flatten)
#=> {1 => [10, 20], 2 => [30, 40]}
#    ^ item id            ^^  ^^ item quantity

引用: