質問

RoR チュートリアルでは、ORM が機能するためにテーブルごとに 1 つのモデルを想定しています。私のDBスキーマには、概念的に5つの機能の機能に分割された70のテーブルがあります(たとえば、特定のテーブルは1つの機能グループに唯一の唯一の機能グループに存在し、異なるグループのテーブル間の関係が最小限に抑えられます。)概念的なグループごとにモデルを設計する必要がありますか、それとも単純に 70 個の Rails モデルを用意し、グループ化を「概念的」のままにする必要がありますか?ありがとう!

役に立ちましたか?

解決

私は、大規模なアプリの 1 つで、テーブル/モデルが概念的に名前でグループ化されていることを確認するだけでこれをカバーしています (テーブルとモデルの関係はほぼ 1:1 です)。例:

events
event_types
event_groups
event_attendees
etc...

そうすることで、TextMate などを使用するときに、モデル ファイルがアルファ ソートによって適切にグループ化されます。このアプリには 80 個のモデルがあり、物事を整理しておくのに十分に機能します。

他のヒント

おそらく、70 個のモデルがあるはずです。グループごとに 1 つずつ、合計 5 つの名前空間を持つようにモデルに名前空間を設定することもできますが、それは価値がある以上に面倒になる可能性があります。おそらく、各グループ全体で共通の機能がいくつかあるでしょう。その場合、グループごとにその動作を含むモジュールを作成し、それを関連する各モデルに含めます。共有機能がない場合でも、これを行うと、モデルの概念グループをすばやくクエリできるようになります。

ActiveRecord の魔法をすべて活用するには、必ずテーブルごとに 1 つのモデルを使用する必要があります。

ただし、モデル ディレクトリで 70 個のファイルを管理する必要を避けるために、モジュールとサブディレクトリを使用してモデルを名前空間にグループ化することもできます。

たとえば、次のようにすることができます。

app/models/admin/user.rb
app/models/admin/group.rb

モデル Admin::User および Admin::Group の場合、および

app/models/publishing/article.rb
app/models/publishing/comment.rb

公開::記事および公開::コメント用

などなど...

70 個のテーブルの性質とそれらの概念的な関係について詳しく知らなければ、適切な答えを出すことは実際には不可能です。これらのテーブルは従来のテーブルですか、それとも最初から設計したのですか?

テーブルは何らかの継承パターンによって関連付けられているのでしょうか、それともその可能性がありますか?Rails は限られた形式の継承を行うことができます。単一テーブル継承 (STI) を検索します。

個人的には、70 個のテーブルでの作業を避けることに多大な努力を費やします。これは、70 個のモデルとコントローラー、およびそれらの 4 つ以上のビュー、ヘルパー、レイアウト、テスト、そして保持するためのメモリ負荷の問題は言うまでもなく、非常に多くの作業であるためです。インドのデザイン。もちろん、私が時間給で、繰り返しを補うのに十分な給料をもらっていた場合は別ですが。

70 個のモデルを作成する前に、次の質問を検討して決定してください。

それぞれのテーブルは、たとえば「cars」テーブルなどの「オブジェクト」とみなされますか、それとも一部のテーブルは、たとえばすべての外部キー列など、リレーションシップ情報のみを保持しているのでしょうか?

Rails では、「オブジェクト」テーブルのみがモデルになります。(特定の種類の関連付けを除く) したがって、機能のグループが 5 つしかない場合、モデルが 70 個に満たない可能性が非常に高くなります。また、あなたが言及した機能のグループが大きく異なる場合、それらは独自のアプリに最適である可能性さえあります。

Rails 標準の単一テーブル継承モデルを使用できるケースは少数あります。おそらく、1 つの特定の機能グループ内のすべてのクラスが同じフィールド (またはほぼすべて同じ) を持っている可能性があります。そんな時はDRYness STIをご活用ください。ただし、意味がわからない場合は、class-per-table を使用してください。

class-per-table バージョンでは、一般的な機能を基本クラスに簡単に取り込むことはできません。代わりに、それをモジュールに取り込みます。次のような階層が役立つ場合があります。

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程度です)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top