0

この質問の前に、私は Ruby 開発にかなり慣れていないことを述べたいと思いますが、個人的には、気まぐれにフォーラムで質問するのではなく、自分で答えを見つけることに専念してきました。そうは言っても、これは私の最初の公式の「投稿」であり、投稿において正確かつ簡潔であるようにあらゆる努力をしました.

RoR ActiveRecord と RubyGems ADO を使用して接続している MSSQL 2005 データベースがあります。

私の AR 基本クラスでは、複数テーブルの SELECT ステートメントを実行する find_by_sql ステートメントを実行しています。クエリは期待どおりに実行され、返されるデータが正確であることを確認しました。

私の目標:

MSSQL 2005 データベースにクエリを実行し、返されたデータを .csv ファイルにダンプする必要があります。

これを達成するための私の計画は次のとおりです。

  1. ruby gem と 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 に答える