1

Rails アプリを作成していますが、データは「シーズン」ごとにリセットする必要がありますが、保持されます。つまり、テーブルから取得されるデータは現在のシーズンのものだけである必要がありますが、前のシーズンにアクセスしたい場合は可能です。

基本的に、データベース全体の複数のインスタンス (季節ごとに 1 つ) が必要です。

クライアントのアイデアは、シーズンの終わりにデータベースをエクスポートして保存し、それから新たに開始することでした。これに関する問題は、すべてのデータを一度に見ることができないことです。

私が持っている唯一のアイデアは、season_idすべてのモデルに列を追加することです。ただし、このシナリオでは、すべてのクエリにwhere(season_id: CURRENT_SEASON). これをすべてのモデルのデフォルトのスコープにする必要がありますか?

これを行う良い方法はありますか?

4

2 に答える 2

2

単一のデータベースにすべてのデータが必要な場合は、それをフィルタリングする必要があるため、正しい方向に進んでいます。とにかくデータは常にフィルタリングされるので、これはまったく問題ありません。大したことではありません。また、あなたが説明していることは、データをアーカイブ済みとしてマークすることに非常に似ているように聞こえます(現在のシーズンにないものは基本的にアーカイブされます)。これは、すべてのレコードにブール値フラグを設定することで非常に一般的に行われ、通常は達成されます(私は信じています)それを非表示にするための true または false、または同等のメソッド。

scopeおそらくまたはが必要になるでしょう。 adefault_scopeの主な欠点は、現在のシーズン以外のデータにアクセスするすべての場所でdefault_scope使用する必要があることですが、デフォルトのスコープを使用しないということは、すべての呼び出しでスコープを指定する必要があることを意味します。デフォルトのスコープは時々おかしな場所に適用されるように見えることもあり、私の経験では、使用しているスコープについて常に明示することを好みます (つまり、 を使用することはありません) が、これはより個人的な好みです。.unscopeddefault_scope

データベースの設計方法に関しては、そのデータが現在のシーズンにあるかどうかを示すブール値フラグをすべてのレコードに追加するかseason_id、現在のシーズン ID とフィルターに対してチェックされる を含めることができます。その通りです。いずれにせよ、ある種のスコープはそれを行うための良い方法です。

単純なブール値を使用する場合、現在のシーズンの終わりまたは新しいシーズンの開始時に、現在のシーズン レコードを最新ではないものとしてマークする必要があります。これを便利にするためにレーキ タスクまたは類似のタスクが必要になる場合がありますが、メンテナンスが少し必要になります。

コードでプラス定数を使用してseason_id現在の季節を示す場合 (おそらく構成ファイルを介して)、季節ごとに DB の更新が必要ないため、現在の季節としてマークする方が簡単です。

于 2013-04-08T19:34:31.347 に答える
1

[免責事項: 私は Ruby に詳しくないので、データベースの観点からコメントします。]

これに関する問題は、すべてのデータを一度に見ることができないことです。

古いバージョンにアクセスできるようにしておく必要がある場合は、それらを同じデータベースに保持する必要があります。

「バージョン化された」(または「一時的」または「履歴化された」)データモデルを設計することは、ブラックアートのようなものです.モデルが現在どのように見えるか教えてください。バージョン管理されたオブジェクト間の接続を処理する場合、事態は特に複雑になる可能性があります。

それまでの間、この投稿を見てください。このようなモデルの 1 つの例です (ドメインとは関係ありませんが、いくつかのアイデアを提供できれば幸いです)。

または、Oracle のフラッシュバック クエリなどの DBMS 固有のメカニズムを使用することもできますが、これは明らかにすべての人が利用できるわけではなく、永続的な履歴を保持するのには適していない可能性があります...

于 2013-04-08T20:17:07.430 に答える