我正在创建一个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和更多spaghetti)。
你会怎么做?
答案 0 :(得分: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
与城市模型存储在一起而不是在单独的表中存储,否则没有很多其他方法来组织您的课程。