我正在使用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,但我找不到解决这个问题的方法,有什么建议吗?
答案 0 :(得分:1)
答案 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插件中修复上述问题,或将其替换为其他日期时间验证程序。