首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用(8.4)的JRuby on Rails忽略默认值

使用(8.4)的JRuby on Rails忽略默认值
EN

Stack Overflow用户
提问于 2011-02-08 01:46:24
回答 1查看 979关注 0票数 0

我在迁移中创建了一个表(只是为了简化问题),如下所示:

代码语言:javascript
复制
create_table :test_defaults, :force => true do |table|
     table.integer   :failure,       :default => -1, :null => false
end

因此,有一列名为failure。当我执行这个rails命令时:

代码语言:javascript
复制
td = TestDefault.create!

JRuby在以下方面失败:

代码语言:javascript
复制
ActiveRecord::StatementInvalid: ActiveRecord::JDBCError: ERROR: null value in column
"failure" violates not-null constraint: INSERT INTO "test_defaults" ("failure")
VALUES(NULL) RETURNING "id"

而ruby版本成功地使用了这样的查询:

代码语言:javascript
复制
INSERT INTO "test_defaults" ("failure") VALUES(-1) RETURNING "id"

我在跑:

代码语言:javascript
复制
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删除那些括号),那将是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-08 04:14:44

好的。找到了这个答案:

代码语言:javascript
复制
activerecord-jdbc-adapter-1.1.0/lib/arjdbc/postgresql/adapter.rb

我们有线路(@59):

代码语言:javascript
复制
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,这通常是不好的。

代码语言:javascript
复制
    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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4928797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档