元祖若手のプログラミング奮闘記

元祖若手の奮闘記。主にメモ

RailsのModelを複雑にした時

SQLのこんな動きをしたい
UPDATEする時JOINしてGROUPBYしてって時

update
  items
inner join (
  select
    orders.item_id,
    count(*) count
  from
    orders
  group by
    item_id
  ) myorders
set
  items.orders_count = myorders.count
 where
  items.id = myorders.item_id


Arelなら綺麗にかけるけども
現場でArelを使ってかいてなかった。。

って時に考えた結果こうなった
ベタ書きってどうよ。。

order = Order.select("#{Order.tn}.item_id, COUNT(*) count").group(:item_id)
Item.joins("INNER JOIN (#{order.to_sql}) myorders")
  .where("#{Item.tn}.id = myorders.item_id")
  .update_all("#{Item.tn}.orders_count = myorders.count")