0

レールスコープが何をするのか完全には理解していません。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クエリは同一であり、すべての列が返されますが、正しい順序ではありません。どちらかしたい

  1. 正しく順序付けられた名前付きスコープを使用する
  2. プレーンクエリを関数でラップしますが、すべての列を返します

ありがとう!

編集:

完全を期すために、名前付きスコープは次のとおりです。

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'
     )}
4

2 に答える 2

0

最初のケースでは、これらの2つの列を指定する選択オプションを渡しているため、これらの2つの列が返されます。より多くの列が必要な場合は、それらをリストします(table_name。*を使用して、テーブルのすべての列を取得できます)

2番目のケースでは、名前付きスコープ内で呼び出しfindていますが、これは意味がありません。名前付きスコープは単なる条件とオプションのセットであり、実際findにそこで行うべきではありません。その場合、あなたが見つけようとしているすべてのオプションを無視しているのではないかと思います。

あなたはの線に沿ってもっと何かが欲しい

scope :popular_this_month, lambda{
     joins(:order_line_items).
     where('order_line_items.created_at > ?',Date.today-1.month).
     select(...).
     order(...).
     group(...)}

これは、最初の例と同じ動作になるはずです。

于 2012-12-12T17:50:48.003 に答える
0

避ける価値のあることの1つは、古いfind構文と新しい構文を混在させることwhereです。

scope :popular_this_month, lambda {
  joins(:order_line_items)
    .where('order_line_items.created_at > ?', Date.today - 1.month)
    .select('order_line_items.design_id as id,sum(order_line_items.quantity) as quantity')
    .group('order_line_items.design_id')
    .order('quantity desc')
}

それが問題かもしれないと思います。

于 2012-12-12T17:51:36.053 に答える