如何更有效地组织资源类

时间:2012-01-25 05:30:06

标签: ruby-on-rails ruby ruby-on-rails-3 design-patterns

我正在创建一个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)。

你会怎么做?

1 个答案:

答案 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与城市模型存储在一起而不是在单独的表中存储,否则没有很多其他方法来组织您的课程。