0

我想先声明我对 Ruby 开发还很陌生,但就我个人而言,我一直致力于自己寻找答案,而不是在论坛上异想天开地提问。话虽如此,这是我的第一个正式“帖子”,我已尽一切努力在我的帖子中做到准确和简洁。

我有一个使用 RoR ActiveRecord 和 RubyGems ADO 连接的 MSSQL 2005 数据库。

在我的 AR 基类中,我正在运行一个 find_by_sql 语句,该语句正在执行一个多表 SELECT 语句。我的查询按预期执行,并且我已验证返回的数据是准确的。

我的目标:

我需要查询 MSSQL 2005 数据库,然后将返回的数据转储到 .csv 文件中。

我的计划是:

  1. 使用 ruby​​ gems & ADO 连接到 MSSQL DB
  2. 使用 Ruby AR 使用 find-by-sql 查询数据库(由于查询的性质)
  3. 使用 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,然后放置结果。不幸的是,我无法弄清楚。

无论如何,我得出了相同的结果:

再一次,我知道有一段时间,我可以想出一个精心设计的解决方案,但现在,我想尽量保持简单(因为我是开发新手,并试图学习小步骤)。

任何帮助将不胜感激(即使只是将我指向正确的方向也会很棒!)。

谢谢你。

4

2 回答 2

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

这不是我的想法,通过将标题键与属性匹配可能有一种更简单的方法。祝你好运!

同行

于 2009-10-08T16:44:41.207 回答
0

要不就

FasterCSV.open("c://file30.csv", "w") do |csv|
  od30.each |o|
     csv << o
  end
end

http://fastercsv.rubyforge.org/

于 2009-10-08T18:19:08.910 回答