2012-01-25 22 views
0

我正在創建一個rails應用程序,並且有一部分在我設計我的代碼的方式中導致了一些麻煩。我覺得我這樣做太麻煩了,我想知道是否有設計模式或通常更好的方法來做到這一點。情況是這樣的:如何更有效地組織資源類

我有一個城市模型和城市可以存儲木材,石頭和黃金。這些資源隨着時間的推移而變化。他們有自己的屬性,如amount,changed_timestamp。

現在,我認爲創建3個獨立的模型,比如wood_production,stone_production和gold_production似乎是個好主意,看起來相當不錯。我還創建的委託和虛擬屬性,這樣我可以執行類似:

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 

問題在於它是資源特定的。我更想擁有一個set_resource方法,該方法可以在不關心資源類型的情況下繼續執行(不使用ifs和更多的意大利麪條)。

你會怎麼做?

回答

1

在不改變任何東西,使用你已經是現有的代碼,只需添加一個方法,像最簡單的方法:

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 

調用city.modify_resource!(:wood, -10)將減去10木材和更新的時間戳。

它也取決於你如何存儲數據。資源是否與城市一起存儲,或存儲在* _production表中,self.wood只是wood_production的別名?

除非您想用更簡單的方法來存儲每個城市的更多數據,例如將change_timestamp與城市模型存儲在一起而不是單獨的表格中,否則沒有其他方法可以組織您的課程。

+0

這是後者,它是wood_production.amount的別名。我不想將所有東西都存儲在城市中,所以我想這是更好的方式,使用發送。謝謝! – Spyros

+0

是的,然後沒有更好的方法來組織它。使用'send'獲得更一般的修改屬性的方法會更好。雖然它是一個虛擬屬性,但我會調整我的示例,以便直接調用它而不是別名。 –