2010-11-22 4 views
1

oracle_enhanced_adapter를 통해 연결하는 읽기 전용 oracle 데이터베이스에서 Ruby on Rails 3.0으로 작업하고 있습니다.레일 3과 오라클 : NLS 설정에서 소수 구분 기호를 사용하지 않음

알려진 "n + 1 쿼리"문제로 돌아가서 나는 includes 메소드를 시도했습니다.
레일 가이드의 설명과 달리 생성 된 두 번째 쿼리는 필수 ID를 정수가 아닌 부동 소수점 값의 문자열 표현으로 나열했습니다. 원래 ID는 NUMBER 유형입니다.

불행히도 NLS 설정 데이터베이스는 소수점 구분 기호로 ","가 필요하다고 생각되는 을 포함하여 독일의 경우입니다. 그래서 나는 항상 ORA-01722 오류 as described here을 얻습니다. 더 정확하게

:

@var.assoc.includes(:another_assoc).where("column_1 = ?", some_value)

수익률

ActiveRecord::StatementInvalid: OCIError: ORA-01722: invalid number: SELECT "TABLE_A".* FROM "TABLE_A" WHERE ("TABLE_A"."ID" IN ('1715.0','1716.0','1717.0','1718.0','1719.0','1720.0','1721.0'))

(이것은 "기호로 문자열"과 같은 몇 가지 산만 세부 사항을 포함하기 때문에 내가 위의 레일 코드를 단순화했다 변환)

언급 한대로 데이터베이스는 읽기 전용이므로 사용하면

alter session set nls_numeric_characters = '.,' 

데이터베이스에서 직접 작업했습니다. 그러나 레일 세션을 변경하는 올바른 방법을 찾을 수 없었습니다.

내가 찾은 모든 것이 레일즈 2를 참조하거나 사용되지 않는 기능을 사용하는 것으로 보입니다.
레일즈 3.0에서 어떻게 해결할 수 있습니까?

또는 Rails (또는 oracle_enhanced_adapter)가 나열된 모든 ID를 Fixnum으로 변환하려면 어떻게해야합니까?

감사와 안부, 팀

우리는 오라클을 사용하여 동일한 문제가 있고, 우리는 초기화 ( config/initializers/something.rb에 배치)에 다음 코드를 배치하여 그것을 해결
+0

안녕하세요, Tim, 안녕하세요. 이 문장을 생성하는 레일 코드를 게시 해주십시오. – Patrick

답변

1

:

BigDecimal.class_eval do 
    alias :old_to_s :to_s 

    def to_s(format='F') 
    old_result = self.old_to_s(format) 
    (old_result[-2..-1] == ".0" ? old_result[0..-3] : old_result) 
    end 
end 

그것을 기본 키로 사용하는 열 유형에 의해 발생합니다. NUMBER으로 신고하면 BigDecimal으로 변환됩니다. 양자 택일로 당신의 ID를 NUMBER(10) 또는 좀 더 명백하게 FixNum (id가 올바르게 변환 될 것임)으로 매핑되는 유사한 것으로 선언 할 수 있습니다.

희망이 도움이됩니다.

+0

고마워, 너 멋지네 .-) – bunter

관련 문제