Rails 1.2.x でActiveRecordを使わない方法。

RailsActiveRecordを使いたくない場合、config/environment.rbに

config.frameworks -= [ :active_record ]

と書く方法が以前から紹介されていました*1。……が、これは手元の1.2.6でエラーになります。

どうやら1.2.1からActiveRecordを外せなくなっていたようです。以前書いたRailsアプリケーションを久々に起動して初めて気づきました。

問題になるのは2箇所。rails-1.2.6/lib/initializer.rbの、

  • initialize_whiny_nils
  • load_observers

の2つのメソッドがActiveRecordに依存しています。

この問題は既に修正されており、以下の修正を1.2.6に加えれば動くようになります(たぶん)。

単純な修正ですが、ソースを書き換えるのは嫌なので、以下のようにしてみました。

config/environments.rb の Rails::Initializer.run ... の前に以下を追加。

if '1.2.1' <= RAILS_GEM_VERSION && RAILS_GEM_VERSION <= '1.2.6'
  require File.join(File.dirname(__FILE__), 'no_ar_patch.rb')
end

以下をconfig/no_ar_patch.rbに保存。

module Rails
  class Initializer
    alias :_load_observers :load_observers
    alias :_initialize_whiny_nils :initialize_whiny_nils
  
    def load_observers
      return unless configuration.frameworks.include?(:active_record)
      _load_observers
    end
    
    def initialize_whiny_nils
      if configuration.frameworks.include?(:active_record)
        _initialize_whiny_nils
        return
      end
    
      if configuration.whiny_nils
        NilClass.class_eval do
          def id
            raise RuntimeError, "Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id", caller
          end
        end
      end
    end
  end
end

で、ActiveRecordを外しても動くようになりました。


load_observersの方はともかく、whiny_nilsが問題でした。whiny_nilsの機能は2つあって、

なのですが、ActiveRecord無しの場合は1つ目の機能だけサポートするようにしました。

の冒頭のWHINNERSをrequireされる前に書き換える方法を思いつかなかったので……。

*1:実際にはこれだけでは外れませんでした。こちらの記事を参照