0

次のような(問題を単純化するためだけに)移行で作成されたテーブルがあります。

create_table :test_defaults, :force => true do |table|
     table.integer   :failure,       :default => -1, :null => false
end

したがって、failureという名前の1つの列。このrailsコマンドを実行すると:

td = TestDefault.create!

JRubyは次のように失敗します:

ActiveRecord::StatementInvalid: ActiveRecord::JDBCError: ERROR: null value in column
"failure" violates not-null constraint: INSERT INTO "test_defaults" ("failure")
VALUES(NULL) RETURNING "id"

一方、rubyバージョンは次のようなクエリで成功します。

INSERT INTO "test_defaults" ("failure") VALUES(-1) RETURNING "id"

私が実行している:

ruby 1.8.7, 
rails 2.2.2, 
jruby 1.5.6, 
activerecord-jdbc-adapter (1.1.0)
activerecord-jdbcpostgresql-adapter (1.1.0)
jdbc-postgres (8.4.702)

提案をいただければ幸いです。グーグルで役立つものを見つけることができず、バグを誰に報告すればよいのかさえわかりません。

乾杯。

編集:ハ。負のデフォルトでのみ発生するようです。ゼロ以上で問題ありません。

EDIT2:以下の私の答えから、postgres8.4の負のデフォルト値の括弧の周りのコードの問題です。誰かがgemのアップグレードを待たずにこの問題を回避する方法を提案できる場合(postgresにこれらのブラケットを削除するように指示するなど)、それは大いにありがたいです。

4

1 に答える 1

0

Ok。これに対する答えを見つけました:

activerecord-jdbc-adapter-1.1.0/lib/arjdbc/postgresql/adapter.rb

行があります(@ 59):

def default_value(value)
    # Boolean types
    return "t" if value =~ /true/i
    return "f" if value =~ /false/i

    # Char/String/Bytea type values
    return $1 if value =~ /^'(.*)'::(bpchar|text|character varying|bytea)$/

    # Numeric values
    return value if value =~ /^-?[0-9]+(\.[0-9]*)?/

    # Fixed dates / timestamp
    return $1 if value =~ /^'(.+)'::(date|timestamp)/

    # Anything else is blank, some user type, or some function
    # and we can't know the value of that, so return nil.
    return nil
  end
end

postgresから負のデフォルト値が返されると、たとえば"(-1)"角かっこで囲まれて返されます。ただし、上記の数字の正規表現は括弧内で一致しません。

バグをログに記録するために登録しようとしましたが(http://kenai.com/jira/browse/ACTIVERECORD_JDBC)、サーバーは登録中に失敗していました。

編集:作成されたバグ: http: //kenai.com/jira/browse/ACTIVERECORD_JDBC-151

編集:また、前のコードと同じ場所でこれが必要になりました。"(-1)".to_i0を返しますが、これは通常は不良です。

    def type_cast(value)
        case type
            when :integer then value = remove_brackets_from_negative(value)
        end
        super
    end
    def remove_brackets_from_negative(value)
        value.gsub!(/[\)\(]/,"") if value.is_a?(String)
        value
    end
于 2011-02-08T04:14:44.020 に答える