[Rails 5] モデルの継承元がActiveRecord::BaseからApplicationRecordに変更された

こんにちは、hachi8833です。BigBinaryシリーズのRails 5翻訳記事をお送りいたします。

元記事

訳文ではバージョンやリンクなどを現時点の内容に更新しています。

確認に使った環境

モデルの継承元がActiveRecord::BaseからApplicationRecordに変更された(翻訳)

2016年6月にRails 5.0.0がリリースされました。重要な変更点のひとつとして、5.0.0以降ではすべてのモデルがApplicationRecordを継承するようになった点が挙げられます。

class Article < ActiveRecord::Base # Rails 4
end

class Article < ApplicationRecord  # Rails 5
end

ActiveRecord::Baseはどのように変わったのでしょうか?

実際にはさほど大きな変更はありません。Rails 5アプリでは、以下のapplication_record.rbファイルが自動的にapp/models/ディレクトリに追加されます。

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

※この仕組みは、各コントローラがActionController::BaseではなくApplicationControllerを継承しているのと似ています↓。

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
end

# 各コントローラ
class ArticlesController < ApplicationController
  ...
end

Rails 5アプリで必要となるあらゆるカスタマイズや拡張は、このApplicationRecordに対して行うことになります。

たとえば、Active Recordに何か機能を追加したいとしましょう。Rails 4.2ではたとえば以下のようにします。

module MyAwesomeFeature
  def do_something_great
    puts "なんかめんどくさいことをする"
  end
end

ActiveRecord::Base.include(MyAwesomeFeature)

しかしこの方法では、ActiveRecord::BaseMyAwesomeFeatureが常にインクルードされてしまうので、ActiveRecord::Baseを継承するすべてのクラスで、必要の有無にかかわらずMyAwesomeFeatureがインクルードされてしまいます。

特に、Railsアプリでプラグインやエンジン(mountable engine)を使っていると、ActiveRecord::Baseに適用したモンキーパッチがこうしたプラグインやエンジンにまで影響してしまうことがあります。

Rails 5でApplicationRecordが導入されたことにより、ApplicationRecordを継承するモデルに対してのみカスタマイズを加えられるようになりました。これにより、(プラグインやエンジンを除外して)カスタマイズをRailsアプリのみに限定できます。

class ApplicationRecord < ActiveRecord::Base
  include MyAwesomeFeature

  self.abstract_class = true
end

Rails 4からの移行

Rails 5アプリでは、デフォルトでapplication_record.rbファイルがmodelsディレクトリに置かれます。

Rails 4アプリをRails 5に移行する場合は、以下の内容でapplication_record.rbファイルを作成し、さらにすべてのモデルで継承元をActiveRecord::BaseからApplicationRecordに変更します。

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

関連記事(Rail 5新機能)

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ