我想通过声明我对Ruby开发相当陌生来形容这个问题,但是,就个人而言,我一直致力于尝试自己找到答案,而不是在论坛上异想天开地提问。话虽这么说,这是我的第一个官方“帖子”,我已尽一切努力在我的帖子中保持准确和简洁。
我有一个MSSQL 2005数据库,我正在使用RoR ActiveRecord& RubyGems ADO。
在我的AR Base Class中,我正在运行一个find_by_sql语句,该语句正在执行多表SELECT语句。我的查询正在按预期执行,并且我已验证返回的数据是否准确。
我的目标:
我需要查询MSSQL 2005数据库,然后将返回的数据转储到.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,然后放入结果。不幸的是,我无法弄清楚。
无论如何,我得出了同样的结果:
同样,我知道有一段时间,我可以提出一个精心设计的解决方案,但是现在,我想尝试保持简单(因为我是开发新手,并试图学习小步骤)。 / p>
非常感谢任何帮助(即使只是指向正确的方向我也会很棒!)。
谢谢。
答案 0 :(得分:1)
find_by_sql
仍然会尝试将结果映射到对象,在您的情况下是Dp_display对象。因为它们是ActiveRecord对象,所以您可以像任何属性一样访问它返回的列,但表中不存在的任何派生列都是只读的。
您似乎正在尝试转储对象数组而不是每个对象。尝试这样的事情:
FasterCSV.open("c://file30.csv", "w") do |csv|
csv << ['here', 'are', 'my', 'headers']
od30.each |o|
csv << [o.acct_no, o.email_1, o.cur_bal, o.od_dt]
end
end
这是我的头脑,通过将标题键与属性匹配,可能有一种更简单的方法。祝你好运!
对等
答案 1 :(得分:0)
或者只是
FasterCSV.open("c://file30.csv", "w") do |csv|
od30.each |o|
csv << o
end
end