2013-05-09 14 views
18

データベースコンポーネントではないモデルを持つアプリケーションを構築しています。 私たちはこのテーマに取り組むために他の人がレールコミュニティでやっていることを知りたいのです。Rails - アクティブでないモデルを置く場所(ディレクトリ)

私たちはどこに配置するのか苦労しています。

我々が持っている必要があります。

app/models/domain 

または

app/domain/models 

または多分

app/models # Business Models 
app/models/ar # Active Record Models 

または多分

app/models/domain/ # Business Models 
app/models/domain/ar # Active Record Models 

これは、レール・スタンダードにどれくらい近いか、必要なものに適した構造をどれくらい作り出すのかに苦労していることです。

我々はサービスオブジェクトなどのオブジェクトを考えるならば、我々はダウンする

app/models/service-object 

app/models/ # For plain active record 

別のルートを持つことができ、例えば、アプリ内でのものを持っていません我々は、レールのアプリを経由してアクセスしたい場合は、代わりに

/app/models/service_objects 

/service_objects 

は、おそらく我々は設定より規約を利用するために/アプリを使用する方がよいでしょう。

+5

このディレクトリは「モデル」と呼ばれます。これは "active_record子孫のみ"とは呼ばれません。私はちょうど一緒に入れて、上にモンゴイドのモデルを投げる:) –

+0

あなたは実際にはモデルの中でARだけを固執したい場合は 'lib'の下に置くことができます – Raindal

+1

' lib'でもそれらを固執することを再考したいと思います。私はlibにファイルを貼り付けるのが好きです。再利用のために宝石の中に抽出するための良い候補と考えています。 –

答えて

12

私の経験では、これらのモデルを置く場所の分割は、アプリケーションの特定のコンテキストで機能的に表現するものになります。

私は通常リソースベースのモデルのためにapp/modelsを予約します。そのモデルが、アプリケーションによってインスタンス化され、操作されるリソースを表している場合、ここに移動します。 ARまたはdbをサポートする必要はありません。

モデルが一貫した機能を果たしてもパラメータによって異なる場合は、アプリ内でトップレベルのディレクトリを指定します。例えば、app/mailersapp/observersなどです。しかし、オブザーバを必要とするリソースが1つの場合は、app/observersディレクトリに1つのファイルだけを持つことは意味がありません。

他のすべてはlibになります。これが望ましい理由はいくつかあります。

  1. ファイルをいつ必要とするかは、libで選択できます。あなたは、あなたのアプリが起動するときにどのファイルが読み込まれるかをはるかに選択することができます。 app/modelsにすべてを入れると、ロードされる内容に細分性はありません。

  2. あなたのアプリが成長するにつれてあなたのモデルを名前空間にすることは、libで簡単になります。確かにapp/modelsで名前空間ができますが、app/modelsのいくつかのネスティングレイヤーは常に厄介なものになります。名前空間はlibにしておくことをお勧めします。

  3. 機能的に正しい場所に物を持っていると、ハウスキーピングがはるかに簡単になります。それは資源ではないのですか?それはオブザーバーではない? libにある必要があります。このような前向きな考え方をしている理由は、開発者にその発見の可能性を提供することにあります。

14

サービスオブジェクトの場合、通常はアプリケーションディレクトリapp/services/の下に直接存在します。ワーカーとシリアライザもこのパターンに従います。app/workers/app/serializers/ ARではないモデルについては、モデルディレクトリにそれらを貼り付けることができます。それは私のそれに取るだけです。

+0

+1それは役に立ちます、ありがとう。アプリケーションが大きくなるにつれて、34個のActive Recordモデルと12個のNon-Active Recordモデルで終わる可能性があること、そしてモデルは46個のミッシュマッシュを持つことに少し気になります。それは大丈夫かもしれません、我々はその潜在的な将来についても疑問に思っています。 –

+2

これに同意する - ある時点で、特定の機能に適合する安定した非ARモデルがあれば、それらを常にモジュールに抽出することができます。 – mikeryz

+0

それはまた、アプリケーションによる懸念を分離することにもつながります。 1つのアプリケーションがそれほど大きくなくても、それを管理できないようにする必要はありません。たとえば、アプリが大きくなりすぎると、authを独自のアプリケーションに分離し、そのパターンに従ってAPIを介して通信することを検討します。 –

1

モデルではないクラスがある場合は、フォームを表しているかもしれませんが、先に進み、libに入れてください。

あなたのアプリケーションに直交する場合、つまり、別のアプリケーションを呼び出すために使用されるインタフェースである場合、他のアプリケーションへの適用性に応じてプライベートまたはパブリックの宝石としてまとめられます。

結局、それは本当に問題ではありません。 1つのことを選んで、残りのチームと同意します。物事を移動するのは簡単です。特に、アプリケーションのロードパスに使用することを決定したものを追加すると便利です($LOAD_PATH += '...')。

9

モデルの場合、このディレクトリはActiveRecordサブクラスではなく、モデル用であるため、app/modelsに配置する必要があります。

+0

これはうまくいく、私はレール5でこれをやってきた –