1

配置の中核として多形ツリーテーブルを使用するコンテンツ管理システムアプリケーションがあります。ツリーが非常に大きくなると、かなりの数の異なるモジュール(約25)があるため、:include =>:instanceを実行するだけではマスタードがカットされないという問題が発生しました。インスタンスは、ポリモーフィックな関係の名前です。

面白い部分は、ほとんどの場合、これらのアイテムの大規模なリストが必要な場合、本当に必要なのは関連するテーブルからの名前だけであり(たとえば、インデックスバーの目的で)、残りはすべて中央のテーブルにあります。そのため、中央テーブルの名前に何らかの列キャッシュを実装する必要があると思いました。(railsがすでに行っているカウンターキャッシュのように)。

これを管理するプラグインがすでに存在するかどうか疑問に思っていましたか?

そうでない場合は、中央テーブルに「name」列を追加します。すべてのポリモーフィックモデルはスーパークラスを継承するため、アイテムが作成または更新されるたびに名前を中央テーブルにプッシュするコールバックを追加するだけです。それなら、そもそも大規模な移行を行ってデータを入力しますか?

そのデザインに何か欠陥はありますか?

より柔軟になると思いますが、列は、必要に応じて後で他のものを格納できる、ある種のシリアル化されたキャッシュである可能性がありますか?ああ!:D

4

1 に答える 1

0

私自身の質問に答えるために、中央テーブルに「cached_name」列を追加し、「rebuild_cached_name!」を作成しました。すべてのレコードを調べて、キャッシュされた名前を適切な値に設定するメソッド。キャッシュ列を作成した移行から再構築メソッドを呼び出しました。

次に、抽象クラス (ポリモーフが継承するクラス) の after_create メソッドを変更し、中央のテーブルに cached_name を割り当てるようにしました。また、通常の名前が変更されるたびに cached_name を更新する after_update メソッド呼び出しも追加しました。

非常に単純ですが、インデックス バーの生成などの単純な状況でポリモーフを呼び出す必要がなくなりました。

于 2010-03-08T08:12:28.783 に答える