Jruby rails,无法从mysql数据库中读取某些DateTime值

时间:2010-12-29 06:06:11

标签: ruby-on-rails jruby

我正在使用rails 2.3.2,jruby 1.5.1,mysql 5.1和activerecord -jdbcmysql-adapter-1.1.0.gem 问题是:如果数据库表中有一个datetime列,并且该列恰好有一个类似'xxxx-xx-xx 00:00:00'的值,则无法从rails读取该值。

这是控制台输出: Console session screen shot

我将s.from设置为'2010-1-1 08:00:00',我在时区+8:00,所以在数据库中它是utc,值为'2010-1-1 00 :00:00' 。此值无法从数据库中读回,但它存在于数据库中。

如果数据库中的日期时间字符串不以'00:00:00'结尾,则不会出现问题。 我想这是activerecord-jdbcmysql-adapter gem的一个bug,但我找不到解决这个问题的方法,有什么建议吗?

2 个答案:

答案 0 :(得分:1)

肯定可能是activerecord-jdbc中的错误。你能以测试用例的形式表达你的问题吗?或者在JIRAGithub

中提交错误

答案 1 :(得分:1)

我遇到了同样的问题。我发现它是由插件validates_date_time引起的,它覆盖了方法ActiveRecord::ConnectionAdapters::Column.string_to_time。没有像“2010-01-01”这样的时间部分,此方法无法解析时间字符串并返回零值,因为它假设必须有一个时间部分(例如“2010-01-01 00:00:00”)

但是,在JRuby JDBC Adapter中,如果时间部分全部为零,则丢弃时间部分,请参阅函数timestampToRuby

protected IRubyObject timestampToRuby(Ruby runtime, ResultSet resultSet, Timestamp time)
        throws SQLException {
    if (time == null && resultSet.wasNull()) return runtime.getNil();

    String str = time.toString();
    if (str.endsWith(" 00:00:00.0")) {
        str = str.substring(0, str.length() - (" 00:00:00.0".length()));
    }
    if (str.endsWith(".0")) {
        str = str.substring(0, str.length() - (".0".length()));
    }

    return RubyString.newUnicodeString(runtime, str);
}

这就是ActiveRecord为此属性返回nil的原因。

要解决此问题,您可以在validates_date_time插件中修复上述问题,或将其替换为其他日期时间验证程序。