将方法保存到数据库

时间:2014-08-17 14:11:28

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我正在构建基于浏览器的RPG,我希望能够根据其他对象属性以不同的方式计算对象的属性。

更具体地说。我有一个单元模型,其中包含健康,力量,防御等属性。

我希望有一个单独的技能模型,其中每个实例提供一种不同的方式来计算技能的总伤害,基于单位属性。

实施例

火球:

total_damage = unit.intelligence * 2 + 5

投掷斧:

total_damage = unit.strength + unit.precision

如何有效地将其存储在数据库中? 感谢

2 个答案:

答案 0 :(得分:0)

如果这些变体的数量与您说的一样多,那么请查看表达式解析器,例如https://github.com/rubysolo/dentaku

在每个表达式中仅提供您认为可能使用的变量列表并对其进行评估。表达式当然可以存储在数据库中。

请记住,它会有一定的性能开销。

答案 1 :(得分:0)

对于您描述场景的方式,在我看来,您的不同类型的单元将共享相同的属性但需要不同的行为。这非常适合单表继承。请注意,现在它可能只是total_damage对每种单位的计算方式不同,但稍后可能是您希望不同的单位走不同。例如,大象单位将比侦察兵慢慢行走。

假设您已经拥有单位型号。您想在该Units表中添加类型列。该列将指定单位的kind

您的模型现在看起来应该是这样的:

class Unit < ActiveRecord::Base
  def total_damage
  end
end

class Chariot < Unit
  def total_damage
    # Whatever damage a chariot can do!
  end
end

class Scout < Unit
  def total_damage
    # Whatever damage a scout can do!
  end
end

如果所有子模型都应该共享相同的属性,那么STI是一种很好的方法。如果您认为只有一个子模型使用了20列,则可能需要创建不同的表。