[Rails 2.0] Time#to_s(:sym) と Ruby RSS の Time の不整合
こんなところで嵌るとは。
Rails 2.0 では Date, Timeのオブジェクトに対してTime#to_s(:db)のような形でデータベースに特化したフォーマットの文字列を取得することができるようになっているようだ。
で、これが、RSS::Rss::Channel:Item#date の Timeクラスとの相性が悪い。
Ruby の RSS パーサー では、Time#to_s に対して、
class << @#{name} undef_method(:to_s) alias_method(:to_s, :#{type}) end
のような形で、Time#to_sを特異メソッドとして再定義してしまっている(install_date_element メソッドからたどれます)。つまり、Railsが定義したTime#to_s(:sym)が無効になってしまう罠。
結果、
# map Rss::Channel::Item object to ActiveRecord object
record.pubDate = item.pubDate
なんてことをやって record.save しようとすると、wrong number for (1 of 0) なんていう不明なエラーにでくわす。
みんなが勝手にクラスをいじると、こんな形でエラーになるよ!、という悪い見本ですね、こりゃ。ActiveRecord に Time や Date をいれるときは、Time.new を使った方が良さそうです。