0

我在迁移中创建了一个表(仅用于简化问题),如下所示:

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

因此,一列名为失败。当我执行这个 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:从我下面的回答来看,这是postgres 8.4中负默认值括号周围的代码问题。如果有人可以在不等待 gem 升级的情况下提出解决此问题的方法(例如告诉 postgres 删除这些括号),将不胜感激。

4

1 回答 1

0

好的。找到了这个问题的答案:

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_i返回 0,这通常很糟糕。

    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 回答