QA@IT

Railsのアソシエーションが入り組んできて、やりたいことができない

2999 PV

Rails4で開発しています
railsでのアジャイル開発を読んだりしながら、ecサイトを作ってみているのですが、モデル同士の連携が込み入ってきて、少し混乱しています。
現在、

class Order
  has_many :line_items
end

#Cartはorderがcreateされる時、line_itemsをorderに引き渡して削除されます
class Cart
  has_many: line_items
end

class LineItem
  belongs_to :order
  belongs_to :product
end

class Product
  has_many :line_items
  belongs_to :buyer
end

#(商品(product)を出品した人
class Buyer
  has_many :products
end

といった構造をしています

productが単価(price)をline_itemが購入された数(quantity)を持っています

それでやりたいことなのですが

実際に購入された商品(product)の総売り上げや、

商品ごとの売り上げを出品者(buyer)が確認する時。

といったさい、どのような取り出し方がよいのでしょうか。

また、現在、eachしたものにまたeach,eachとしているのですが、もうちょっとすっきりとした方法があったら
教えていただけると幸いです。

回答

その手の処理はeachで全部回してしまうと重そうですね。

/products/:id
といったパスで、特定の商品について見るページなどは、仕方のない所もあるでしょうけれど、全商品の売上げランキングの様な処理をeachのみで計算するのは、現実的ではありません。

こういった集計処理には、SQLのgroupやsumが有効になります。 Rails3以降使える様になったArelでは、そういったクエリも発行しやすいので、以下のコードを試してみて下さい。

# 
LineItem.joins(:product).group(:product).sum(:price).each{ | product, total |
  puts "productID:#{product.id}の合計売上げは#{total}です。"
}

この辺はSQLの話になるので、Railsについてだけ調べても分かりにくいかもしれません。発行されるSQL文を読んでみるのをオススメします。

編集 履歴 (0)
  • とても参考になりました。
    ちょっと敬遠していたのですが、使えるとかなり便利そうなのでActiveRecode、SQLの方もちゃんと勉強したいと思います。
    回答ありがとうございました。
    -
  • お役に立てたようで良かったです! 健闘をお祈りします! -
ウォッチ

この質問への回答やコメントをメールでお知らせします。