1

読み取り専用の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に変換させるにはどうすればよいですか?

よろしくお願いします、ティム

4

2 に答える 2

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をとして宣言することもできます。これは、より明確に(IDが正しく変換される)NUMBER(10)にマップされるものです。FixNum

お役に立てれば。

于 2010-11-22T13:17:46.253 に答える
1

誰かがgemORA-01722を使用して育てられたものを探しに来るならactiverecord-oracle_enhanced-adapter、ここに更新された答えがあります。

ActiveRecord::StatementInvalid (OCIError: ORA-01722: invalid number)

これは、BigDecimalを保存するときに、かなり最近のバージョン(Rails6およびoraclegem 6.0)でも引き続き発生します。

configを使用して小数点を修正するには、この本当に良い答えを参照してくださいdatabase.yml

development:
  adapter: oracle_enhanced
  username: XXX
  password: XXX
  host: XXXX
  nls_numeric_characters: '.,'
于 2020-09-16T13:35:08.040 に答える