如何将多个ActiveRecord查询结果合并为一个和一个计数?

时间:2016-05-10 15:03:50

标签: ruby-on-rails ruby ruby-on-rails-4 rails-activerecord

我的Order模型has_many OrderItemOrderItem belongs_to ProductOrder

create_table "order_items", force: :cascade do |t|
  t.integer  "product_id"
  t.integer  "order_id"
  t.decimal  "unit_price",  precision: 10, scale: 2
  t.integer  "quantity"
  t.decimal  "total_price", precision: 10, scale: 2
  t.datetime "created_at",                           null: false
  t.datetime "updated_at",                           null: false
  t.string   "cat"
end

create_table "orders", force: :cascade do |t|
  t.integer  "location_id"
  t.string   "day"
  t.datetime "created_at",                           null: false
  t.datetime "updated_at",                           null: false
  t.decimal  "subtotal",    precision: 12, scale: 3
  t.decimal  "total",       precision: 12, scale: 3
  t.integer  "role"
  t.text     "notes"
end

有几个不同的Location个/用户,每个Location每天只有一个Order。我可以列出每个Location和每天

的产品
@order = Order.where(location: @location, day: 'Wednesday')
@order_items = @order.order_items

我希望能够显示每天从所有位置组合的每件商品,但是如果它们出现在每个订单中,我会生成商品的副本。有没有办法“合并”每个@order_items数组中的某些值?

如果位置1在星期三订购1个面包而位置2在星期三订购3个面包,那么我想创建一个只有一个面包项目,数量为4的数组。我在下面给出了一个包含两个面包的数组数组中的项目,每天一个。

@locations = Location.all
@order = Order.where(location: @locations, day: 'Wednesday')
@order_items = OrderItem.where(order: @order)

我意识到这可以通过遍历数组并创建一个新数组来完成,但有更好的或Rails方式吗?

1 个答案:

答案 0 :(得分:0)

我想你想要这样的东西:

OrderItem.joins(:order).group(:location_id).group(:day).sum(:quantity)

这将为您提供如下所示的哈希:

{[1, "Thursday"]=>4, [1, "Wednesday"]=>2}

我实际上不知道你可以使用一个数组作为哈希索引,但确实如此。用作散列键的数组由location_id和day组成。