我在迁移中创建了一个表(只是为了简化问题),如下所示:
create_table :test_defaults, :force => true do |table|
table.integer :failure, :default => -1, :null => false
end因此,有一列名为failure。当我执行这个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)感谢您的建议。在google上找不到任何有用的东西,甚至不知道该向谁报告这个bug。
干杯。
编辑: Ha.似乎只有负默认值才会发生这种情况。零和更大都可以。
EDIT2:从我下面的答案来看,在postgres 8.4中,负值的默认值是括号内的代码问题。如果有人可以提出解决这个问题的方法,而不等待宝石升级(比如告诉postgres删除那些括号),那将是非常感谢的。
发布于 2011-02-08 04:14:44
好的。找到了这个答案:
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上),但是服务器在注册过程中失败了。
编辑:已创建的bug: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
endhttps://stackoverflow.com/questions/4928797
复制相似问题