[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クラスとの相性が悪い。


RubyRSS パーサー では、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 を使った方が良さそうです。