我想先声明我对 Ruby 开发还很陌生,但就我个人而言,我一直致力于自己寻找答案,而不是在论坛上异想天开地提问。话虽如此,这是我的第一个正式“帖子”,我已尽一切努力在我的帖子中做到准确和简洁。
我有一个使用 RoR ActiveRecord 和 RubyGems ADO 连接的 MSSQL 2005 数据库。
在我的 AR 基类中,我正在运行一个 find_by_sql 语句,该语句正在执行一个多表 SELECT 语句。我的查询按预期执行,并且我已验证返回的数据是准确的。
我的目标:
我需要查询 MSSQL 2005 数据库,然后将返回的数据转储到 .csv 文件中。
我的计划是:
- 使用 ruby gems & ADO 连接到 MSSQL DB
- 使用 Ruby AR 使用 find-by-sql 查询数据库(由于查询的性质)
- 使用 Ruby FasterCSV 检索数据并将其转储到 .csv 文件。
当前场景:
我能够成功连接到数据库,并使用 AR 查询数据。
问题:
一旦 find-by-sql 查询运行,AR 就会以散列数组的形式返回数据。正如我之前所说,我是 AR 新手,并且已经在 RoR 中开发了几个月。因此,我不知道如何访问数组的属性。
这是我到目前为止所拥有的:
require 'rubygems'
require 'activerecord'
require "fastercsv"
ActiveRecord::Base.pluralize_table_names = false
ActiveRecord::Base.establish_connection(
:adapter => 'sqlserver',
:mode => 'ODBC',
:dsn => 'xxxx',
:database => 'xxxx',
:username => 'blah',
:password => 'blahblah',
:host => 'server'
)
class Dp_display < ActiveRecord::Base
od30 = Dp_display.find_by_sql("SELECT dd.acct_no, dd.cur_bal, dd.od_dt, ra.email_1
FROM dp_display dd, rm_acct ra
WHERE dd.rim_no = ra.rim_no and dd.cur_bal < -10 and dd.class_code = 125 and
dd.od_dt = convert(varchar, getdate()-30,101)
ORDER BY dd.od_dt desc");
#testing od30 returning values successfully
puts od30
结果:
当我查看 od30 时,所有数据都正确返回。数据如下所示(仅列出第一个数组元素):
od30 = Array (2 elements)
+[0] = {Dp_display}#<Dp_display:0x7667d74>
+@attributes = Hash (4 elements)
+'acct_no'-> 1122334455
+'email_1'-> whodat@where.com
+'cur_bal'-> -333.55
+'od_dt'-> 2009-09-08 00:00:00.000
+[1] = {Dp_display}#<Dp_display:0x7667d10>
使用 FasterCSV,我执行以下操作:
FasterCSV.open("c://file30.csv", "w") do |csv|
csv << od30
csv文件创建成功,当我打开它时,它只包含:
<Dp_display:0x7667d74>
我想要得到的是:
1122334455,whodat@where.com,-333.55,2009-09-08 00:00:00.000
出于学习/测试目的,我尝试使用许多不同的数组函数访问数组元素,包括 model.attributes、each_index、flatten,然后放置结果。不幸的是,我无法弄清楚。
无论如何,我得出了相同的结果:
再一次,我知道有一段时间,我可以想出一个精心设计的解决方案,但现在,我想尽量保持简单(因为我是开发新手,并试图学习小步骤)。
任何帮助将不胜感激(即使只是将我指向正确的方向也会很棒!)。
谢谢你。