2009-11-02 6 views
7

私は少しメッセージを送信しています。これは、バックグラウンドワーカーが電子メール/ SMS(またはテスト用に適切にログ)を送信するために取得する要求からのメッセージのキューイングを処理します。Rails:モデルはいつですか? lib?

質問:これはModel(/ app/models)かlib(under/lib)ですか?

私はこれにいくつかの宗教をしたいと思います。

理論A:(私の現在の理論)ActionMailer :: BaseやActiveRecord :: Baseなどをサブクラス化していない限り、コードはlibに入るはずです。

理論B:(理論は私が向いている)アプリケーション固有のものはモデルでなければなりません。一般的に使用できるものはlibになければなりません。

理論C:「データモデル」のみが「モデル」に含まれている必要があります。しかし、ActionMailerサブクラスはこのルールを破ります。

私が知る限り、どちらの方法でもうまくいくでしょうが、どちらかというと微妙な機能的または哲学的な理由があります。

思考?

+0

私はあなたに同意します:ActiveRecordとco。から継承しない場合は、モデルではありません。私はその意見を完全な答えの思考に変えると言っても十分ではありません^^ – marcgg

答えて

5

メッセージがActiveRecordまたはActionMailerから継承されるかどうかにかかわらず、ビューとコントローラが対話するオブジェクトのモデルが必要になる可能性があります。あなたのケースでは、彼らはMessageクラスのインスタンスを扱います - そのためのモデルが必要です。

メッセージ送信モジュールについては、モジュールをどのクラスにも含めることができる場所でコードを再利用する予定がある場合は、ライブラリに抽出することは素晴らしいことです。

これは単なる「小さな」メッセージ送信モジュールなので、モデル内で開始し、最終的には別のモジュールに抽出して、別の場所で役立つか、モデルがあまりにも面倒になる可能性があります。

+0

あなたはこの理論Bを上記のマップと思いますか? –

+0

はい、理論Bが正しいです。しかし、ほとんどの場合、依然としてアプリケーション固有ではない可能性のあるモデルが必要です。 Messageクラスを例にとります。はい、あなたは同じ方法で複数の異なるアプリでメッセージとやりとりすることができますが、ほとんどの場合、メッセージの動作をアプリごとにオーバーライドまたはカスタマイズする必要があります。したがって、すべてのアプリケーションでモデルを作成し、lib(s)をインクルードしてください。 – bensie

2

ここでは、基本的なビジネスについてもっと考えてみるべきでしょう。モデルは、その名前が示すように、実際のシステムやプロセスを表現(モデル化)するためのものです。したがって、親指のルールはこれでなければなりません:このエンティティは、私のアプリケーションで表現しようとしているシステムで何らかの役割を果たしていますか?答えが肯定的である場合、エンティティはモデルであるための良い候補である。ただし、後で再利用するために、メッセージングモジュールのコア機能を別のライブラリに実装してモデルに組み込むだけでも問題ありません。

+0

あなたはこの理論Bを上記のマップと考えていますか? –

1

私は 'データモデル'理論が好きで、できる限りそれに固執しようとしていますが、ベンジーとミラノは正しいアイデアを持っていると思います。ビューとコントローラが関連付けられている場合は、モデルを使用する必要があります。別のクラスの中から機能を参照するだけの場合は、libに入れます。

関連する問題