2012-01-18 4 views
0

多相キューアソシエーションを作成したい。私は2つのキューを考えています。一つは建物を作ること、もう一つはユニットを作ることです。Rails異なる動作のポリモーフィックアソシエーション

キューにはアイテムの追加や削除などの多くのプロパティがありますが、いくつかの違いもあります。

例えば、建物にはレベルがあり、ユニットにはレベルがありません。 QueuedItemポリモーフィッククラスには通常、削除メソッドのようないくつかのメソッドがあります。ただし、アイテムが建物であるかユニットであるかによって異なる方法で処理されます。

さらに、レベルの列は、軍の列に並ぶ項目に対して全く重要ではありません。

私の質問は、これらのニーズに基づいて、それを設計する最良の方法は何ですか?

Building 
Unit 
QueuedItem -> queued_id, queued_type, city_id 

または私はそれ以上の中間モデルを追加する必要があります:私はちょうど(キューに入れられた項目は、常に都市に属している)のような3機種を進めるべきでしょうか?どう思いますか ?

答えて

1

説明からわかるように、キューに登録されているアイテムだけでなく、キュー自体のクラスが実際に必要なようです。したがって、キュー関連のメソッドや操作はキュークラスに入り、建物やユニットにのみ関連するものはそれらのクラスに入ります。

Aキュークラスは、オブジェクトの種類ごとに異なる実装を必要としそうにないすべてはその要素を並べ替え、追加、削除、および多分するための方法を含むだけであろう。これらのメソッドには、キューに追加や削除以外の副作用がない方が良いです。たとえば、オブジェクトが削除された後に何か他のことが起こる必要がある場合、これはQueue#removeの呼び出し元が行うことができます。建物やユニットが含まれているかどうかによって、キュー自体が異なる動作をする必要がある場合は、BuildingQueueとUnitQueueが必要です。両方とも、基本的なQueueクラスまたはインクルードされたQueueモジュールから共通のメソッドを継承することができます。

建物やユニットに固有のその他のもの(レベルがあるかどうか、特定の統計情報があるかどうかなど)は、適切な建物クラスとユニットクラスに入ります。キューがどのように振る舞うかを知る必要はありません。

+0

はい、これは私が今日考えていたものですが、これはおそらく最善の方法だと思います。しかし、キューは具体的なクラスであるべきだと思いますか?私はmixinモジュールのようなものを作る方がおそらく良いと思うでしょう、あなたはそれに同意しますか?次に、具体的なモデルBuildingQueueは継承されます。私はちょっとこれが好きです。 – Spyros

+0

この場合、基本クラスまたは混合モジュールのどちらでも問題なく動作します。あなたが一番好きなアプローチで:)。 – Bira

0

キューに追加/削除するロジックを持つmoduleを作成し、両方のクラスに含めることができます。多くのクラスで使用する予定の場合は、プラグインに移動して、キューとして実装するモデルにヘルパーを追加することもできます。

関連する問題