monthly gimite

試験運用中。

Railsで undefined method `<=' for :db:Symbol (NoMethodError)

手元のアプリのRailsのバージョンを1系から2.0.2にあげたら

undefined method `<=' for :db:Symbol (NoMethodError)
        from /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/quoting.rb:61:in `quoted_date'
        from /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/quoting.rb:29:in `quote'

という謎のエラーがおきたので調べていたんですが、

entry= MyEntry.new()
rss= RSS::Parser.parse("...", false)
entry.latest_fetched= rss.items[0].date
entry.save()

というようにRSSのアイテムのdateをActiveRecordに突っ込んでいたのが原因でした。どうもRSSのdateは勝手に特異メソッドでto_sを置き換えてるらしく、それがActiveSupport(こちらも勝手にTime#to_sを拡張している)と干渉しているようです。

entry.latest_fetched= rss.items[0].date.dup()

とすると回避できました*1

*1:dupでは特異メソッドは継承されないから。