ロジックをコントローラーからモデルに移行することをお勧めします。しかし、複雑なシステムでは、Rails Way に従って大部分のメソッドが 1 つのライナーであったとしても、これは常に非常に大きなファイルにつながります。
モデルを他のモジュールに分割し、それらを元のモデルに含めることに頼りました。たとえばmodel_flags、、、model_validationなどです。もっと良い方法がありますか?
ロジックをコントローラーからモデルに移行することをお勧めします。しかし、複雑なシステムでは、Rails Way に従って大部分のメソッドが 1 つのライナーであったとしても、これは常に非常に大きなファイルにつながります。
モデルを他のモジュールに分割し、それらを元のモデルに含めることに頼りました。たとえばmodel_flags、、、model_validationなどです。もっと良い方法がありますか?
これはかなり古い質問であり、回答済みとしてマークされていますが、まだ優れたGoogleジュースがあるので、追加する価値があると思いました...
Rails 3 では ActiveSupport::Concern が導入されました。これは、モデル間で共有される動作をモジュール化するために使用できます。または、さらに言えば、太りすぎたモデルをスリムにすることもできます。
DHH 自身が、簡潔で素晴らしい例の要旨を提供しています。
私はいくつかの理由でこれをしません。
まず、物事が本来あるべき場所にあるという仮定に違反します。これは、そもそもレールにとっておそらく最大のボーナスです。モデルにモデルを貼り付けると、新しい人がプロジェクトに足を踏み入れて、プロジェクトを簡単にナビゲートできます。それを引き出すと、特にモジュールに何かを削除するための唯一のロジックがモデルサイズを縮小することである場合は、遅延と混乱が追加されます。
第二に、あなたはそれからほとんど何も得られず、何かを失います。ほとんどすべてのエディターとIDEが大きなファイルのナビゲーションの苦痛を和らげる最近では、ファイルサイズは重要ではありません。ものをモジュールに移動すると、実際にはこの現代的な使いやすさの一部が失われ、1つのモデルで作業している間、あなたとあなたの同僚または将来のメンテナはさらにいくつかのファイルを飛び回る必要があります。
とはいえ、ハードコアレールのベストプラクティスの提案からわかることは、モデルが非常に大きく複雑な場合、設計に欠陥があり、モデルはモジュールではなく個別のモデルにできるいくつかのことを表している可能性があるということです。
さて、すべてを1つのモデルにまとめるのは間違っているとは言えませんが、さまざまな懸念を分離できることも非常に有効だと思います。少なくともトレードオフです。
そして、私は自分の質問に対する答えを投稿しています。これは、Rails Wayがまさにそれを行う方法を見つけたからです:http: //github.com/jakehow/concerned_with
詳細については、こちらをご覧ください:http: //m.onkey.org/2008/9/15/active-record-tips-and-tricks
オブジェクト モデルの知識がないため、アドバイスするのは少し難しいですが、すべての検証/関連付け/コールバックをその場所に配置する必要があることを完全に確信している場合は、まだ因数分解する方法があります。一般的な行動。したがって、コードの大部分をあるファイルから別のファイルに移動してクラスを再度開くだけではありませんが、モジュール/プラグインを使用して一般的な種類の動作を記述することは良い考えです.
たとえば、Facebook 風のアクティビティ フィードを構築していて、すべてが「イベント」を生成する必要がある場合、その「イベント可能」動作をモジュールに移動したい場合があります。モジュールが含まれていると、関連付け/検証が定義されます。 /等。これらの関連付けをどこでも手動で指定することは、何かを Eventable として宣言するほど表現力がなく、安全ではないため、このアプローチは実際にコードの明快さを向上させると思います (多くの場所でロジックを複製することになります)。 、そしてロジックが変更されると、残りはわかります...)
全体として、オブジェクト モデルをよく見てください。テスト スイートで、すべてのテストに多くのセットアップが必要であることに気付いた場合は、オブジェクト モデルに何かが欠けていることを示す良い指標になる可能性があります。繰り返しますが、いくつかのサンプル コードは素晴らしいものです。
モジュールは賢明に聞こえます。メソッド呼び出し (検証、コールバック、プラグインなど) をモジュールに抽出することはしませんが、抽出は独自のメソッドに限定します。
いつものように、サンプル コードを投稿していただけると助かります。モデルをクリーンアップするための一般的な戦略を想像するのは難しいと思います。それはコードの性質に依存します。