次のシナリオに最適なデザインを見つけようとしています - ダンス競技会の結果を保存するアプリケーションです。
イベントには複数のラウンドが含まれ、各ラウンドには多数のパフォーマンス (ダンスごとに 1 つ) が含まれます。各パフォーマンスは、スコアシートを返す多くの審査員によって審査されます。
ラウンドには、ファイナル ラウンド (6 つ以下のダンス カップルを含む) と通常のラウンド (6 つ以上のダンス カップルを含む) の 2 種類があります。それぞれに、わずかに異なる動作とデータが必要です。
決勝ラウンドの場合、各スコアシートには、最終ショーでジャッジが 1 位、2 位などと付けた 6 カップルの順序付きリストが含まれます。私はこれらの順位を「スコアシートには 6 位が含まれる」と呼びます。順位にはカップル番号とそのカップルの順位が含まれます
通常のラウンドの場合、各スコアシートには順序付けられていない M カップルのセットが含まれます (M < ラウンドに参加するカップルの数 - 競技主催者によって決定される正確な値)。私はこれらのリコールを「M がリコールするスコアシート」と呼んでいます。リコールにはスコアやランキングは含まれません
例えば、ファイナルで
- 1位:カップル56
- 2位:夫婦234
- 3位:夫婦 198
- 4位:カップル98
- 5位:カップル 3
- 6位:カップル125
通常のラウンドの場合 次のカップルがリコールされます 54,67,201,104,187,209,8,56,79,35,167,98
これの私の素朴なバージョンは次のように実装されています
イベント - has_one final_round、has_many ラウンド
final_round - has_many final_performances final_performance - has_many final_scoresheets final_scoresheet - has_many 順位
ラウンド - has_many パフォーマンス パフォーマンス has_many スコアシート スコアシート has_many リコール
しかし、私はこれが必要とする複製が好きではありません。また、いくつかの並列階層 (ラウンド、パフォーマンス、スコアシート用) があり、維持するのが面倒です。