読み取り専用のOracleデータベース(oracle_enhanced_adapterを介して接続)でRuby onRails3.0を使用しています。
既知の「n+1クエリ」の問題が発生した場合、includesメソッドを試しました。
Railsガイドの説明とは異なり、生成された2番目のクエリは、必要なIDを整数ではなく、float値の文字列表現としてリストしました。元の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 2を参照しているか、非推奨の関数を使用しているようでした。
Rails 3.0でこれを解決するにはどうすればよいですか?
または、Rails(またはoracle_enhanced_adapter)にリストされているすべてのIDをFixnumに変換させるにはどうすればよいですか?
よろしくお願いします、ティム