2012-01-25 19 views
0

私はレールアプリケーションを作成しています。私のコードを設計する方法にいくつかの問題を引き起こしている部分があります。私はこれをちょっと面倒なことをしていると感じています。デザインパターンがあるのか​​、それとも一般的にこれを行うのが良いのかを知りたいと思います。状況は次のようなものです:リソースクラスをより効率的に整理する方法

私は都市モデルを持っていて、都市は木、石、金を保管することができます。これらのリソースは、タイムスタンプに基づいて時間とともに変化しています。彼らはamount、changed_timestampのような独自の属性を持っています。

今、私はwood_production、stone_production、gold_productionのような3つの別々のモデルを作成することは良い考えのように思えました。私は、特定のリソースタイプの量やタイムスタンプを変更したいときしかし、問題が発生

city.wood or city.stone 

:私はのようなものを実行できるように、私はまた、委任者と仮想属性を作成しました。建物のコストは

{:wood => 200, :stone => 100, :gold => 50} 

と作成されているとします。だから、建物が作られていると私は今、都市からのリソースを減らさなければならないと言う。これは、私のような何かをする必要があります:

self.wood_production.update_attribute(:change_timestamp, Time.now) 
self.wood -= v 
self.save 

これは、リソースに固有の問題です。私ははるかにリソースの種類(ifsとより多くのスパゲッティを使用せずに注意を払うことなく手続きを続けるset_resourceメソッドを持っていると思います)。

どうすればよいですか?

答えて

1

何も変更し、あなたが持っている既存のコードを使用することなく、最も簡単な方法は、ちょうどのようなメソッドを追加することです:10木材を減算し、タイムスタンプを更新してしまうcity.modify_resource!(:wood, -10)を呼び出す

def modify_resource!(type, quantity) 
    self.send("#{type}_production").update_attribute(:change_timestamp, Time.now) 
    self.send("#{type}=", self.send(type) + quantity) 
    self.save 
end 

を。

これはデータの保存方法によっても異なります。リソースの合計は都市に格納されているのか、それとも* _productionテーブルに格納されていますか?self.woodwood_productionのエイリアスですか?

change_timestampを別のテーブルではなく都市モデルに保存するなど、よりシンプルな都市ごとのデータを格納する簡単な方法を使用しない限り、クラスを整理する方法は他にもたくさんあります。

+0

後者ですが、wood_production.amountのエイリアスです。私は都市のすべてを保管していきたいと思っていないので、sendを使うのが良い方法だと思います。ありがとう! – Spyros

+0

さて、本当にそれを整理するための良い方法はありません。属性を変更するためのより一般的な方法を得るために 'send'を使うだけで良いです。仮想的な属性ですが、私は私の例を微調整して、エイリアスではなく直接呼び出すだけです。 –

関連する問題