RoR チュートリアルでは、ORM が機能するようにテーブルごとに 1 つのモデルを想定しています。私のDBスキーマには、概念的に5つの機能グループに分割された約70のテーブルがあります(たとえば、特定のテーブルは1つの機能グループにのみ存在し、異なるグループのテーブル間の関係は最小限に抑えられます。)したがって、概念グループごとにモデルを設計する必要があります、または単に 70 の Rails モデルを用意して、グループ化を「概念的」のままにする必要がありますか? ありがとう!
7 に答える
ほとんどの場合、70 個のモデルが必要です。各グループに 1 つずつ、5 つの名前空間を持つようにモデルに名前を付けることができますが、それは価値があるよりも面倒な場合があります。多くの場合、各グループに共通の機能がいくつかあります。その場合、その動作を含むグループごとにモジュールを作成し、それを関連する各モデルに含めます。共有機能がない場合でも、これを行うことで、モデルの概念グループをすばやくクエリできます。
テーブル/モデルが概念的に名前でグループ化されていることを確認するだけで (テーブルとモデルの関係はほぼ 1:1)、大規模なアプリの 1 つでこれをカバーしています。例:
events
event_types
event_groups
event_attendees
etc...
そうすれば、TextMate などを使用しているときに、モデル ファイルがアルファ ソートによって適切にグループ化されます。このアプリには 80 個のモデルがあり、物事を整理するのに十分に機能します。
すべての ActiveRecord マジックを利用するには、必ずテーブルごとに 1 つのモデルを使用する必要があります。
ただし、モデル ディレクトリで 70 個のファイルを管理する必要がないように、モジュールとサブディレクトリを使用してモデルを名前空間にグループ化することもできます。
たとえば、次のようにすることができます。
app/models/admin/user.rb
app/models/admin/group.rb
モデルの管理者::ユーザーと管理者::グループ、および
app/models/publishing/article.rb
app/models/publishing/comment.rb
Publishing::Article および Publishing::Comment 用
などなど…
70 モデルの作成に飛び込む前に、次の質問を考慮して決定してください。
各テーブルは、「車」テーブルなどの「オブジェクト」と見なされますか、それとも、すべての外部キー列など、関係情報のみを保持するテーブルの一部ですか?
Rails では、「オブジェクト」テーブルのみがモデルになります。(特定の種類の関連付けを除いて) そのため、機能のグループが 5 つしかない場合、70 個のモデルがない可能性が非常に高くなります。また、あなたが言及した機能のグループが大きく異なる場合、それらは独自のアプリに最適である可能性さえあります.
70 のテーブルの性質とそれらの概念的な関係についての詳細を知らなければ、適切な答えを出すことは実際には不可能です。これらは従来のテーブルですか、それともゼロから設計したものですか?
テーブルはある種の継承パターンによって関連付けられていますか? Rails は限定された形式の継承を行うことができます。単一テーブル継承 (STI) を参照してください。
個人的には、70 のテーブルを使用しないようにするために多大な労力を費やします。これは、70 のモデルとコントローラー、およびそれらの 4 つ以上のビュー、ヘルパー、レイアウト、およびテストを保持することによるメモリ負荷の問題は言うまでもなく、膨大な作業だからです。 indのデザイン。もちろん、私が時間単位で支払われていて、繰り返しを補うのに十分な場合を除きます.
Railsの標準的な単一テーブル継承モデルを使用できる場合がいくつかあります。おそらく、1つの特定の機能グループ内のすべてのクラスが同じフィールド(またはほぼすべて同じ)を持っています。その場合は、DRYnessSTIが提供するものを利用してください。ただし、意味がない場合は、テーブルごとのクラスを使用してください。
テーブルごとのクラスバージョンでは、一般的な機能を基本クラスに簡単に取り込むことはできません。代わりに、モジュールにプルします。次のような階層が役立つ場合があります。
app/models/admin/base.rb - module Admin::Base, included by all other Admin::xxx
app/models/admin/user.rb - class Admin::User, includes Admin::Base
app/models/admin/group.rb - class Admin::Group, includes Admin::Base
すでに述べたように、データベース スキーマなどを知らずにまともなアドバイスをするのは難しいですが、70 以上のモデル (テーブルごとに 1 つ) を作成することに傾倒します。
一部のモデルを捨てることで逃げることができるかもしれませんが、コスト (ごくわずか) を考えると、それらをそこに置いた方がよいかもしれません。
モデルごとにコントローラーとビューを作成する必要はありません(srboisvertの回答による)。リソースごとにコントローラーが必要なだけです (70 よりもはるかに少ないと予想されます。説明から判断すると、おそらく 10 または 15 程度です)。