2009-10-08 85 views
0

我想通過說明我對Ruby開發很新,但是,我個人致力於嘗試自己找到答案,而不是在論壇上異想天開地提問。這就是說,這是我的第一個官方「職位」,我盡我所能在發帖時做到準確和簡潔。RoR ActiveRecord find_by_sql問題

我有一個MSSQL 2005數據庫,我連接到,使用RoR ActiveRecord & RubyGems ADO。

在我的AR基類中,我運行了一個find_by_sql語句,它執行一個多表SELECT語句。我的查詢按預期執行,並且驗證了返回的數據是準確的。

我的目標:

我需要查詢的MSSQL 2005數據庫,然後傾倒返回給.csv文件中的數據。

我的計劃來完成這個工作:

  1. 使用Ruby寶石& ADO連接到MSSQL數據庫
  2. 使用Ruby AR使用find-通過-SQL查詢數據庫(由於查詢的性質)
  3. 使用Ruby FasterCSV檢索數據並將其轉儲到.csv文件。

目前的情況:

我能夠成功連接到數據庫,並使用AR查詢數據。

問題:

一旦發現逐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,被正確返回的所有數據。數據看起來像這樣(只列出第一個數組元素):使用FasterCSV

od30 = Array (2 elements) 
     +[0] = {Dp_display}#<Dp_display:0x7667d74> 
      [email protected] = Hash (4 elements) 
      +'acct_no'-> 1122334455 
      +'email_1'-> [email protected] 
      +'cur_bal'-> -333.55 
      +'od_dt'-> 2009-09-08 00:00:00.000 
     +[1] = {Dp_display}#<Dp_display:0x7667d10> 

,我執行以下操作:

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

CSV文件創建成功後,當我打開它,它只包含:

<Dp_display:0x7667d74> 

我想獲得的是:

1122334455,whodat @磨片re.com,-333.55,2009-09-08 00:00:00。000

爲了學習/測試的目的,我嘗試過使用許多不同的數組函數訪問數組元素,包括model.attributes,each_index,flatten,然後放置結果。不幸的是,我無法弄清楚。

在任何情況下,我想出了相同的結果:

同樣,我知道,有一段時間,我能想出一個複雜的解決方案,但現在,我想盡量保持簡單(因爲我是開發新手,並試圖學習小步驟)。

任何援助將不勝感激(即使只是指着我在正確的方向將是偉大的!)。

謝謝。

回答

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 

這就是把我的頭頂部,有可能是由標題鍵相匹配的屬性做一個簡單的方法。祝你好運!

同行

+0

感謝同行!這工作完美。 在看了你推薦的內容之後,很明顯我並沒有把數組元素當作對象。相反,我傾倒數組本身,而不是它的元素。 非常感謝您幫助我解決問題! – 2009-10-08 17:22:22

0

或者只是

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

http://fastercsv.rubyforge.org/

+0

我可以看到這裏的邏輯,但是當我改變爲代碼,以反映這一點,我收到錯誤: 在「各自」:沒有給出(LocalJumpError)嵌段 此錯誤指的是包含行: od30。每個| o | RubyMine IDE還指出'o'無法解析爲有效的目標。 – 2009-10-08 18:56:38