2010-12-29 5 views
0

私は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'のような値があった場合、この値をレールから読み取ることはできません。Jrubyのレールは、mysqlデータベースから特定のDateTime値を読み取ることができません

ここでコンソール出力です: Console session screen shot

私は「2010年1月1日8時00分00秒」にs.fromを設定し、私はタイムゾーン8にいる:データベースにはUTCですので、00値は '2010-1-1 00:00:00'です。この値は、データベースから読み取ることはできませんが、データベースにあります。

datetime文字列がデータベースで'00:00:00 'で終わらない場合、問題は発生しません。 私はactiverecord-jdbcmysql-adapter gemのバグだと思いますが、これを修正する方法はありません。

答えて

1

これは確かにactiverecord-jdbcのバグです。テストケースの形であなたの質問を表現できますか?または、JIRAまたはGithubにバグを報告しますか?

1

私は同じ問題を抱えていました。そして、それは方法ActiveRecord::ConnectionAdapters::Column.string_to_timeを無効にするプラグインvalidates_date_timeによって引き起こされたことがわかりました。このメソッドは "2010-01-01"のような時間部分のない時間文字列を解析できず、時間部分(例えば "2010-01-01 00:00:00")が必要であると仮定しているためゼロを返します。

はしかし、JRubyのJDBCアダプタでは、時刻部分は破棄され、それがすべてゼロである場合、機能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プラグインで修正するか、別の日付時刻検証ツールで置き換えることができます。