質問
ロジックをコントローラーからモデルにシフトすることをお勧めします。しかし、複雑なシステムでは、メソッドの大部分がRailsウェイごとに1つのライナーである場合でも、常に非常に大きなファイルになります。
モデルを他のモジュールに分割して、元のモデルに含めました。たとえば、 model_flags
、 model_validation
などです。
編集:ActiveConcernの使用を提案する新しい回答を選択しました。また、コードの整理に興味がある人には、この記事作成ActiveRecord Models Thin 、大いに役立つはずです。
解決
これはかなり古い質問であり、回答済みとしてマークされていますが、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
オブジェクトモデルの知識がないため、アドバイスするのは少し難しくなりますが、検証/関連付け/コールバックのすべてが必要であると絶対に確信している場合は、その場所には、一般的な行動を除外する方法がまだあります。そのため、大きなコードを1つのファイルから別のファイルに移動するだけでなく、クラスを再度開くだけではありませんが、モジュール/プラグインを使用して一般的な種類の動作を記述することをお勧めします。
たとえば、Facebook風のアクティビティフィードを作成していて、すべてが「イベント」を生成する必要がある場合は、その「イベント可能」を移動することができます。モジュールへの振る舞い。含まれる場合、関連付け/検証/などを定義します。そのアプローチは実際にコードの明快さを向上させると思います。なぜなら、それらの関連付けをどこでも手動で指定することは、Eventableとして何かを宣言するほど表現力がなく、安全でもないからです(多くの場所でロジックを複製します) 、そしてロジックが変更されたとき、あなたは残りを知っています...)
しかし、全体として、オブジェクトモデルを大きく見てみましょう。テストスイートで、すべてのテストに多くのセットアップが必要であることに気付いた場合、それはオブジェクトモデルに何かが欠けていることを示す良い指標になります。繰り返しますが、いくつかのサンプルコードは素晴らしいでしょう。
- サービスオブジェクトを使用できます: http://railscasts.com/episodes/398-service-オブジェクト
- 懸念事項も使用できます。そのためのフォルダーはデフォルトでRails 4に作成されます: http:/ /railscasts.com/episodes/400-what-s-new-in-rails-4
モジュールは賢明です。メソッド呼び出し(検証、コールバック、プラグインなど)をモジュールに抽出しませんが、抽出を独自のメソッドに制限します。
いつものように、サンプルコードを投稿しておくと役立ちます。モデルをクリーンアップする一般的な戦略を想像するのは難しいと思います。それはコードの性質に依存します。