2010-11-22 51 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