RoR ActiveRecord find_by_sql问题

时间:2009-10-08 16:25:28

标签: ruby-on-rails activerecord fastercsv

我想通过声明我对Ruby开发相当陌生来形容这个问题,但是,就个人而言,我一直致力于尝试自己找到答案,而不是在论坛上异想天开地提问。话虽这么说,这是我的第一个官方“帖子”,我已尽一切努力在我的帖子中保持准确和简洁。

我有一个MSSQL 2005数据库,我正在使用RoR ActiveRecord& RubyGems ADO。

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

我的目标:

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

我的目标是:

  1. 使用红宝石宝石& ADO连接到MSSQL DB
  2. 使用Ruby AR使用find-by-sql查询数据库(由于查询的性质)
  3. 使用Ruby FasterCSV检索数据并将其转储到.csv文件。
  4. 当前情景:

    我能够成功连接到数据库,并使用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>

    非常感谢任何帮助(即使只是指向正确的方向我也会很棒!)。

    谢谢。

2 个答案:

答案 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

http://fastercsv.rubyforge.org/