1

日付から月の値を抽出して、月ごとに値を合計する PostgreSQL クエリがあります。

SELECT vendors.name AS vendor, 
SUM(purchases.invoice_total) AS invoice_total, 
EXTRACT(MONTH FROM purchases.date) AS date 
FROM vendors, purchases 
WHERE purchases.vendor_id = vendors.id 
AND purchases.store_id = ? 
AND purchases.purchase_department_id = ? 
AND (purchases.date BETWEEN ? AND ?) 
GROUP BY vendor, EXTRACT(MONTH FROM purchases.date) 
ORDER BY vendor, date;

DB コンソールで直接クエリを実行すると、次のような結果が得られます。

+------------------------------------+---------------+------+
| vendor                             | invoice_total | date |
+------------------------------------+---------------+------+
| Store 1                            |        448.56 |    1 |
| Store 1                            |        263.44 |    2 |
| Store 1                            |        939.47 |    3 |

問題は Rails のfind_by_sql関数を使用するときに発生します。vendorとのinvoice_total値は正しく返されますが、日付の値は nil として返されます。

#<Purchase date: nil, invoice_total: #<BigDecimal:85c75c8,'0.26344E3',18(18)>>

これは私の呼びかけです。ハードコードされた値を試してみましたが、Rails では Extract 関数が実行されないようです。

<% @purchasesSQL = Purchase.find_by_sql(["SELECT vendors.name AS vendor, SUM(purchases.invoice_total) AS invoice_total, 
    EXTRACT(MONTH FROM purchases.date) AS date 
    FROM vendors, purchases 
    WHERE purchases.vendor_id = vendors.id 
    AND purchases.store_id = ? 
    AND purchases.purchase_department_id = ? 
    AND (purchases.date BETWEEN ? AND ?) 
    GROUP BY vendor, EXTRACT(MONTH FROM purchases.date) 
    ORDER BY vendor, date;", @store.id, purchase_department.id, @start, @end])
%>

私はすでにいくつかのデバッグを行っており、渡した値は nil でも間違っていません。

4

1 に答える 1

2

dateモデルのテーブルに名前が付けられた列があるとあなたは言いますPurchase(これは列のひどい名前です。列名に型名を使用すると、痛みと苦しみが生じるだけです)。おそらくあなたのdate列はdateまたはtimestampです。Purchase.find_by_sqlには、次のものがあります。

EXTRACT(MONTH FROM purchases.date) AS date 

インスタンスPurchase.find_by_sqlを作成しようとします。PurchaseしたがってPurchase、単純な数値を指定してそれを呼び出すとdatePurchaseおそらく列があることに気づきdate、単純な数値を完全な日付またはタイムスタンプとして解析しようとします。単純な数値は、意味のある方法で日付またはタイムスタンプとして解析できないため、おそらくすべて に変換されnilます。

ここで行うことは 2 つあります。

  1. そのdate列の名前を、キーワードと競合しない別の名前に変更しました。
  2. そして、うまくいけば当面の問題を解決するには、月番号に別のエイリアスを使用します。

    EXTRACT(MONTH FROM purchases.date) AS month_number
    

    month_numberこれにより、返されたオブジェクトのメソッドが取得されPurchaseます。

于 2013-06-19T06:35:03.610 に答える