Rails 5もRC版が出てきて、そろそろ仕様が固まってきた頃かと思いますが、見ていたところ、Rails 4へそのまま適用できそうな機能が標準化されていました。
コントローラーとモデルでの違い
Rails 4でコントローラーを作ると、以下のようになります。
class HogesController < ApplicationController
# 中身は略
end
一方で、モデルを作ると以下のようになります。
class Hoge < ActiveRecord::Base
end
この2つの大きな違いですが、ActiveRecord::Base
はactiverecord
gemのクラスなのに対して、AplicationController
はアプリケーションに用意されたものとなっています。なので、「全コントローラーに共通する処理」を、自分でAplicationController
に置くことができます。一方で、ActiveRecord::Base
に共通処理を置くなんて芸当はあまりやりたくないものです。
Rails 5の機能を見ていて
そんな中でRails 5について書かれていたものを見ていると、モデルの基底クラスとしてApplicationRecord
が導入されるという話が入ってきました。
で、せっかくなので実装を確認してみると、なんとRails 4にそのまま適用できるものでした。
AcvtiveRecordと継承
機能だけ継承するときにActiveTypeが必要となるように、ActiveRecordをふつうに継承してしまえばSTIの機能が働いてしまってうまく行きません。それでは、ApplicationRecord
はどのような実装なのでしょうか。
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
end
と、クラスメソッドのabstract_class=
で切り替えていました(これ自体はもっと前のRailsからあります)。ということで、同様に実装すればRails 4でも全モデル共通の操作をApplicationRecord
へまとめることができます。
余談ですが、既存のモデルのActiveRecord::Base
をApplicationRecord
に一括置換する際に、うっかりApplicationRecord
の基底クラスまで書き換えてしまわないように、お気をつけ下さい。