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
を追加する必要があると思いますか?
基本的なRailsアプリケーションでは同じように見えるかもしれませんが、実際にはRailsエンジン、プラグイン/ gem、または_ActiveRecord::Base
_。
ActiveRecord::Base.include(MyFeatures)
は、機能を直接_ActiveRecord::Base
_にミックスし、後で_ActiveRecord::Base
_を使用するために永遠に存在し(「混合しない」ことはできません)、取得する方法はありません元の_ActiveRecord::Base
_は、インクルード後のすべてのコードに含まれています。混在機能の一部がデフォルトのActiveRecordの動作を変更した場合、または2つのエンジン/ gemが同じ名前のメソッドを含めようとしました。
一方、ApplicationRecord
アプローチは、機能を提供しますそれを継承するクラス(モデル)のみ、他のクラス、および_ActiveRecord::Base
_の直接使用モジュールの機能により整頓されたままの状態を保ちます。
これは、エンジンまたはRailsプラグインを使用する場合、ApplicationRecord
以前は不可能だったメインアプリケーションのモデルロジックから独自のモデルロジックを分離できるため、特に重要です。
このすべては このブログ投稿 および このgithubコメント でもうまく説明されています。
これは、@ 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
を使用して継承しました。