我正在将遗留数据库迁移到我的 Rails 应用程序(3.2.3)中。原始数据库带有很多用于报告的长 sql 查询。现在,我想做的是使用 Rails 应用程序中的 sql 查询,然后一一(在时间允许的情况下)将 sql 查询交换为“正确的”Rails 查询。
我有一个临床模型,控制器有以下代码:
@clinical_income_by_year = Clinical.find_all_by_sql(SELECT date_format(c.transactiondate,'%Y') as Year,
date_format(c.transactiondate,'%b') as Month,
sum(c.LineBalance) as "Income"
FROM clinical c
WHERE c.Payments = 0 AND c.LineBalance <> 0
AND c.analysiscode <> 213
GROUP BY c.MonthYear;)
但是,当我运行该代码时,我会遇到一些与格式有关的错误。
Started GET "/clinicals" for 127.0.0.1 at 2012-04-29 18:00:45 +0100
SyntaxError (/Users/dannymcclelland/Projects/premvet/app/controllers/clinicals_controller.rb:6: syntax error, unexpected tIDENTIFIER, expecting ')'
...rmat(c.transactiondate,'%Y') as Year,
... ^
/Users/dannymcclelland/Projects/premvet/app/controllers/clinicals_controller.rb:7: syntax error, unexpected tIDENTIFIER, expecting keyword_end
...rmat(c.transactiondate,'%b') as Month,
... ^
/Users/dannymcclelland/Projects/premvet/app/controllers/clinicals_controller.rb:8: syntax error, unexpected tIDENTIFIER, expecting keyword_end
... sum(c.LineBalance) as "Income"
... ^
/Users/dannymcclelland/Projects/premvet/app/controllers/clinicals_controller.rb:10: syntax error, unexpected tCONSTANT, expecting keyword_end
... WHERE c.Payments = 0 AND c.LineBalance <> 0
... ^
/Users/dannymcclelland/Projects/premvet/app/controllers/clinicals_controller.rb:10: syntax error, unexpected '>'
...yments = 0 AND c.LineBalance <> 0
... ^
/Users/dannymcclelland/Projects/premvet/app/controllers/clinicals_controller.rb:11: syntax error, unexpected '>'
... AND c.analysiscode <> 213
... ^
在将 sql 查询导入控制器之前,我应该对它做些什么吗?虽然查询可能有问题(它是很久以前写的),但当直接在数据库中运行时,它确实可以按预期工作。它返回一个像这样的数组:
----------------------------------------------
| Year | Month | Income |
----------------------------------------------
----------------------------------------------
| 2012 | January | 20,000 |
| 2012 | February | 20,000 |
| 2012 | March | 20,000 |
| 2012 | April | 20,000 |
----------------------------------------------
etc..
任何帮助、建议或一般指示将不胜感激!
我正在阅读http://guides.rubyonrails.org/active_record_querying.html试图将 sql 查询转换为正确的 Rails 查询。
到目前为止,我已经匹配了倒数第二行:
AND c.analysiscode <> 213
和
@clinical_income_by_year = Clinical.where("AnalysisCode != 213")
宝贝步骤!
更新
多亏了 Rails 指南站点,我现在已经对过滤进行了排序,但是我被困在 sql 查询的分组和求和部分上。到目前为止,我有以下内容:
@clinical_income_by_year = Clinical.where("AnalysisCode != 213 AND Payments != 0 AND LineBalance != 0").page(params[:page]).per_page(15)
我正在努力构建以下两行 sql 查询:
sum(c.LineBalance) as "Income"
和
GROUP BY c.MonthYear;)
我的视图代码如下所示:
<% @clinical_income_by_year.each do |clinical| %>
<tr>
<td><%= clinical.TransactionDate.strftime("%Y") %></td>
<td><%= clinical.TransactionDate.strftime("%B") %></td>
<td><%= Clinical.sum(:LineBalance) %></td>
</tr>
<% end %>
</table>
<%= will_paginate @clinical_income_by_year %>