Quantcast
Channel: hachi8833の記事一覧|TechRacho by BPS株式会社
Viewing all articles
Browse latest Browse all 1759

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

$
0
0

こんにちは、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新機能)


Viewing all articles
Browse latest Browse all 1759

Trending Articles