我有一个 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;
直接在数据库控制台中执行查询后,我得到如下信息:
+------------------------------------+---------------+------+
| 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)>>
这是我的电话。我什至尝试过使用硬编码值但什么也没有,但它就像 Extract 函数不会在 Rails 中执行:
<% @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 也不是错误的。
最佳答案
您说您的 Purchase
模型表中有一个名为 date
的列(顺便说一句,这是一个糟糕的列名称,使用类型名称作为列名称只会导致痛苦和痛苦)。大概您的 date
列是 date
或 timestamp
。在您的 Purchase.find_by_sql
中,您有:
EXTRACT(MONTH FROM purchases.date) AS date
和Purchase.find_by_sql
将尝试创建Purchase
实例。所以你给 Purchase
一个简单的数字并称它为 date
,Purchase
可能会注意到它有一个 date
列并尝试将您的简单数字解析为完整日期或时间戳。一个简单的数字无法以任何有意义的方式解析为日期或时间戳,因此它们可能都被转换为 nil
。
你有两件事要做:
- 将该
date
列重命名为其他名称,不与任何关键字冲突的名称。 为了解决您眼前的问题,请为您的月份编号使用不同的别名:
EXTRACT(MONTH FROM purchases.date) AS month_number
这应该让您在返回的
Purchase
对象上获得一个month_number
方法。
关于ruby-on-rails - 为什么 find_by_sql 不适用于 PostgreSQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17183426/