レールスコープが何をするのか完全には理解していません。Railsクエリ:
UserDesign.joins(:order_line_items)
.where('order_line_items.created_at > ?',Date.today-1.month)
.find(:all,
:select=>'order_line_items.design_id as id,sum(order_line_items.quantity) as quantity',
:group=>'order_line_items.design_id',
:order=>'quantity desc'
)
アイテムを返します:
UserDesign Load (0.8ms) SELECT order_line_items.design_id as id,sum(order_line_items.quantity) as quantity FROM "user_designs" INNER JOIN "order_line_items" ON "order_line_items"."design_id" = "user_designs"."id" WHERE (order_line_items.created_at > '2012-11-12') GROUP BY order_line_items.design_id ORDER BY quantity desc
+-----+----------+
| id | quantity |
+-----+----------+
| 199 | 65 |
| 196 | 31 |
| 197 | 31 |
| 198 | 30 |
| 204 | 30 |
| 203 | 30 |
+-----+----------+
これは正しいですが、2つの列のみが含まれています。名前付きスコープと同じクエリを実行すると、次のようになります。
UserDesign Load (0.7ms) SELECT order_line_items.design_id as id,sum(order_line_items.quantity) as quantity FROM "user_designs" INNER JOIN "order_line_items" ON "order_line_items"."design_id" = "user_designs"."id" WHERE (order_line_items.created_at > '2012-11-12') GROUP BY order_line_items.design_id ORDER BY quantity desc
UserDesign Load (1.0ms) SELECT "user_designs".* FROM "user_designs"
+-----+-------+---
| id | de... |...
+-----+-------+---
| 196 | aa... |...
| 199 | fd... |...
| 198 | as... |...
| 197 | as... |...
| 203 | Test |...
| 204 | My... |...
+-----+-------+---
SQLクエリは同一であり、すべての列が返されますが、正しい順序ではありません。どちらかしたい
- 正しく順序付けられた名前付きスコープを使用する
- プレーンクエリを関数でラップしますが、すべての列を返します
ありがとう!
編集:
完全を期すために、名前付きスコープは次のとおりです。
scope :popular_this_month, lambda{
joins(:order_line_items)
.where('order_line_items.created_at > ?',Date.today-1.month)
.find(:all,
:select=>'order_line_items.design_id as id,sum(order_line_items.quantity) as quantity',
:group=>'order_line_items.design_id',
:order=>'quantity desc'
)}