こんにちは、hachi8833です。BigBinaryシリーズのRails 5翻訳記事をお送りいたします。
元記事
- ApplicationRecord in Rails 5(米国BigBinary社のブログより)
- 著者: Prathamesh Sonpatki
訳文ではバージョンやリンクなどを現時点の内容に更新しています。
確認に使った環境
- Rails 5.0.1(5-0-stable) + Ruby 2.4.1
-
Rails 4.2.7(4-2-stable) + Ruby 2.3.3
モデルの継承元が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::Base
にMyAwesomeFeature
が常にインクルードされてしまうので、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新機能)
- [Rails 5] フォームごとに異なるCSRFトークンを受け取れるようになった(翻訳)
- [Rails 5] developmentモードのアセットログはデフォルトでオフになる(翻訳)
- [Rails 5] rails dev:cacheコマンドでdevelopmentモードでのキャッシュを簡単にオン・オフできる
- [Rails 5] コントローラの制約を受けずに任意のビューテンプレートをレンダリングする
- [Rails 5] rakeタスクがrailsコマンドでもできるようになった
- [Rails 5] Rails 5の新フレームワークデフォルト設定ファイルでアップグレード作業を軽減する
- [Rails 5] マイグレーション時にデータベースのカラムにコメントを追加する