ruby-on-rails - 为什么 find_by_sql 不适用于 PostgreSQL?

标签 ruby-on-rails ruby postgresql find-by-sql

我有一个 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 函数时。 vendorinvoice_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 列是 datetimestamp。在您的 Purchase.find_by_sql 中,您有:

EXTRACT(MONTH FROM purchases.date) AS date 

Purchase.find_by_sql 将尝试创建Purchase 实例。所以你给 Purchase 一个简单的数字并称它为 datePurchase 可能会注意到它有一个 date列并尝试将您的简单数字解析为完整日期或时间戳。一个简单的数字无法以任何有意义的方式解析为日期或时间戳,因此它们可能都被转换为 nil

你有两件事要做:

  1. 将该 date 列重命名为其他名称,不与任何关键字冲突的名称。
  2. 为了解决您眼前的问题,请为您的月份编号使用不同的别名:

    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/

相关文章:

ruby - 通过 ruby​​ 脚本设计身份验证

database - 如何让 Navicat 只显示默认的 PostgreSQL 数据库

ruby-on-rails - Rails4.1 : AWS errors missing region

python - 如何在 PostgreSQL 中利用 Python 代码转义字符串进行 SQL 注入(inject)

linux - 使用linux或python删除特殊字符

ruby-on-rails - ActionMailer 不会将电子邮件正文记录到 Rails 控制台

ruby-on-rails - Ruby on Rails - "Add ' gem sqlite 3'' 到你的 Gemfile"

ruby-on-rails - 规范/邮件程序/预览中不提供Rails邮件程序预览

ruby-on-rails - simple_form collection_Radio_buttons 生成额外的标签

javascript - 有没有办法在直播时从 YouTube API 获取通知