2010-11-22 53 views
1

我正在使用只讀oracle數據庫上的Ruby on Rails 3.0(通過oracle_enhanced_adapter連接)。Rails 3和Oracle:NLS設置拒絕小數分隔符

遇到已知的「n + 1查詢」問題,我嘗試了包含方法。
與Rails指南中的描述不同,生成的第二個查詢列出了所需的id不是整數,而是浮點值的字符串表示形式。原始ID是NUMBER類型。

不幸的是,數據庫的NLS設置是針對德國的,其中包括NLS_NUMERIC_CHARACTERS,它預計「,」作爲小數點分隔符。所以我總是得到一個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 = '.,' 

直接在數據庫上工作。但我無法找到改變導軌會議的正確方法。

我發現的一切似乎都指向Rails 2或使用了不推薦使用的函數。
我該如何解決Rails 3.0的這個問題?

或者: 如何強制Rails(或者oracle_enhanced_adapter)將所有列出的id轉換爲Fixnum?

感謝和問候, 添

+0

你好,歡迎來到stackoverflow。你能否請發表這個聲明的導軌代碼? – Patrick 2010-11-22 11:24:45

回答

1

我們不得不使用Oracle同樣的問題,我們通過將下面的代碼到一個初始化(將其放置在config/initializers/something.rb)解決了這個問題:

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 2010-11-22 14:04:30