LoginSignup
3
4

More than 5 years have passed since last update.

Rails 5からバックポートしたい&できる新機能:ApplicationRecord

Posted at

Rails 5もRC版が出てきて、そろそろ仕様が固まってきた頃かと思いますが、見ていたところ、Rails 4へそのまま適用できそうな機能が標準化されていました。

コントローラーとモデルでの違い

Rails 4でコントローラーを作ると、以下のようになります。

app/controllers/hoges_controller.rb
class HogesController < ApplicationController
  # 中身は略
end

一方で、モデルを作ると以下のようになります。

app/models/hoge.rb
class Hoge < ActiveRecord::Base
end

この2つの大きな違いですが、ActiveRecord::Baseactiverecord gemのクラスなのに対して、AplicationControllerはアプリケーションに用意されたものとなっています。なので、「全コントローラーに共通する処理」を、自分でAplicationControllerに置くことができます。一方で、ActiveRecord::Baseに共通処理を置くなんて芸当はあまりやりたくないものです。

Rails 5の機能を見ていて

そんな中でRails 5について書かれていたものを見ていると、モデルの基底クラスとしてApplicationRecordが導入されるという話が入ってきました。

で、せっかくなので実装を確認してみると、なんとRails 4にそのまま適用できるものでした。

AcvtiveRecordと継承

機能だけ継承するときにActiveTypeが必要となるように、ActiveRecordをふつうに継承してしまえばSTIの機能が働いてしまってうまく行きません。それでは、ApplicationRecordはどのような実装なのでしょうか。

app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end

と、クラスメソッドのabstract_class=で切り替えていました(これ自体はもっと前のRailsからあります)。ということで、同様に実装すればRails 4でも全モデル共通の操作をApplicationRecordへまとめることができます。

余談ですが、既存のモデルのActiveRecord::BaseApplicationRecordに一括置換する際に、うっかりApplicationRecordの基底クラスまで書き換えてしまわないように、お気をつけ下さい。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4