2009-10-08 2 views
0

나는 Ruby 개발에 대해 상당히 새롭다는 말로이 질문을 서두르고 싶지만, 개인적으로, 나는 포럼에서 우스꽝스럽게 묻는 질문에 반대하여 직접 대답을 찾으려고 노력하고있다. 즉, 이것이 내 첫 공식 "게시물"이며, 게시 할 때 정확하고 간결한 모든 시도를했습니다.RoR ActiveRecord find_by_sql 질문

RoR ActiveRecord를 사용하는 MSSQL 2005 데이터베이스가 있습니다. & RubyGems ADO.

내 AR 기본 클래스에서 다중 테이블 SELECT 문을 실행하는 find_by_sql 문을 실행하고 있습니다. 내 쿼리가 예상대로 실행되고 있으며 반환 된 데이터가 정확한지 확인했습니다.

내 목표 :

내가 MSSQL 2005 데이터베이스를 조회 한 다음 .csv 파일로 반환되는 데이터를 덤프해야합니다.

이러한 목표를 달성하기 위해 내 계획은 다음과 같습니다

  1. 사용 루비 보석 & ADO 발견별로-SQL을 사용하여 데이터베이스를 조회 할 MSSQL DB
  2. 사용 루비 AR에 연결하기 위해 (때문에에 쿼리의 성격)
  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 볼 때

, 모든 데이터가 올바르게 반환되고있다. 내가 다음을 수행,

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 사용 : 데이터는 (첫 번째 배열 요소를 나열) 다음과 같습니다 CSV 파일이 성공적으로 생성

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

, 나는 그것을, 그것을 열 때 만 포함

<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

감사 피어! 그것은 완벽하게 작동했습니다. 추천 한 내용을 살펴본 후에 배열 요소를 객체로 간주하지 않는다는 것이 분명 해졌습니다. 대신 배열 자체를 덤핑하고 요소가 아닙니다. 알아서 도와 주셔서 감사합니다. –

0

하거나

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

http://fastercsv.rubyforge.org/

+0

은 여기 로직을 ​​볼 수 있지만, I는이를 반영하도록 코드를 변경하면, 나 오류가 나타날 소정없이 블록 (LocalJumpError) 이 에러가 포함 된 선을 의미한다 : od30 '을 각각'에 . 각 | o | RubyMine IDE는 'o'를 유효한 대상으로 확인할 수 없음을 나타냅니다. –