我正在一个只读的 oracle 数据库(通过 oracle_enhanced_adapter 连接)上使用 Ruby on Rails 3.0。
遇到已知的“n+1 查询”问题,我尝试了包含方法。
与 Rails 指南中的描述不同,生成的第二个查询列出了所需的 id 不是整数,而是浮点值的字符串表示形式。原始 ID 的类型为 NUMBER。
不幸的是,数据库 NLS 设置是针对德国的,包括NLS_NUMERIC_CHARACTERS
需要“,”作为小数分隔符的。所以我总是得到一个ORA-01722错误,如此处所述。
更确切地说:
@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'))
(我不得不简化上面的 Rail 代码,因为它包含一些令人分心的细节,比如“字符串到符号”的转换)
如前所述,数据库是只读的,所以使用
alter session set nls_numeric_characters = '.,'
直接在数据库上工作。但我无法找到改变 rails 会话的正确方法。
我发现的所有内容似乎都引用了 Rails 2 或使用了已弃用的函数。
我怎样才能为 Rails 3.0 解决这个问题?
或者:如何强制 Rails(或者 oracle_enhanced_adapter)将所有列出的 id 转换为 Fixnum?
谢谢和最好的问候,蒂姆