2010-11-22 7 views
1

私はRuby on Rails 3.0を読取り専用oracleデータベース(oracle_enhanced_adapter経由で接続)に取り組んでいます。Rails 3とOracle:NLS設定で小数点の桁区切りが拒否されました

既知の「n + 1クエリ」問題に遭遇して、私はインクルードメソッドを試しました。
Railsガイドの説明とは異なり、生成された2番目のクエリは、必要なIDを整数ではなく浮動小数点値の文字列表現としてリストしました。元のIDはNUMBER型です。

残念ながら、データベースのNLS設定は、小数点区切り文字として "、"が必要なを含め、ドイツ向けです。だから私はいつも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

こんにちはTimさん、こんにちは。あなたはこの声明を生成するレールコードを投稿してください。 – Patrick

答えて

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

関連する問題