web-dev-qa-db-ja.com

なぜRails 5はActiveRecord :: Baseの代わりにApplicationRecordを使用しますか?

Rails 5はApplicationRecordをモデル(ActiveRecord)によって継承された抽象クラスとして追加しました。

しかし、基本的に、ApplicationRecordで行うすべての技術的要件は、ActiveRecord::Base。例えば:

module MyFeatures
  def do_something
    puts "Doing something"
  end
end

class ApplicationRecord < ActiveRecord::Base
  include MyFeatures
  self.abstract_class = true
end

そのため、すべてのモデルにMyFeaturesの動作が付加されます。しかし、Rails 4:

ActiveRecord::Base.include(MyFeatures)

ApplicationRecordを使用する利点は何ですか、ApplicationRecordを追加する必要があると思いますか?

48
Hieu Pham

基本的なRailsアプリケーションでは同じように見えるかもしれませんが、実際にはRailsエンジン、プラグイン/ gem、または_ActiveRecord::Base_。

  • ActiveRecord::Base.include(MyFeatures)は、機能を直接_ActiveRecord::Base_にミックスし、後で_ActiveRecord::Base_を使用するために永遠に存在し(「混合しない」ことはできません)、取得する方法はありません元の_ActiveRecord::Base_は、インクルード後のすべてのコードに含まれています。混在機能の一部がデフォルトのActiveRecordの動作を変更した場合、または2つのエンジン/ gemが同じ名前のメソッドを含めようとしました。

  • 一方、ApplicationRecordアプローチは、機能を提供しますそれを継承するクラス(モデル)のみ、他のクラス、および_ActiveRecord::Base_の直接使用モジュールの機能により整頓されたままの状態を保ちます。

これは、エンジンまたはRailsプラグインを使用する場合、ApplicationRecord以前は不可能だったメインアプリケーションのモデルロジックから独自のモデルロジックを分離できるため、特に重要です。

このすべては このブログ投稿 および このgithubコメント でもうまく説明されています。

64
BoraMa

これは、@ BoraMaの答えを拡張し、できればActiveRecord::Base.abstract_classに関する混乱を解消することです。

ActiveRecord::Base.abstract_classは少なくともRails 3.2.0( http://api.rubyonrails.org/v3.2.0/classes/ActiveRecord/Inheritance/ClassMethods。 html )、2012年1月20日にリリースされました。

Rails 4.0.0はドキュメントを改善しました: http://api.rubyonrails.org/v4.0.0/classes/ActiveRecord/Inheritance/ClassMethods.html

したがって、ApplicationRecordが根本的に新しいと考える人にとっては、そうではありません。これは改善であり、重大な変更ではありません。この作業を行うためのActiveRecord::Baseには何も追加されていません。

Rails 4.2.6プロジェクトで同じことをしました。これは、モデルが整数ではなくIDにUUIDを使用しているため、デフォルトのORDER BYを変更する必要があったためです。コピーアンドペーストまたは懸念事項を使用して、UuidModelクラスとself.abstract_class = trueを使用して継承しました。

9
Jordan Pickwell