灵活点系统的Rails模型

时间:2012-09-08 03:10:25

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

我正在尝试为游戏应用程序设计积分系统,并且遇到一些问题,找出设置模型的最佳方法。基本需求是:

  • 每个用户基本上都可以分配一个“PointsCalculator”对象,负责跟踪用户获得的积分

  • 每个用户的“PointsCalculator”逻辑可能会有所不同。例如,一个用户每次连续播放超过一个小时可能会额外获得100分。另一位用户可能会在晚上8点到晚上10点之间获得双倍积分。

我们正在尝试找出创建模型设置的最佳方法,该模型设置允许我们存储可为每个用户定制的逻辑,但仍然是DRY且可测试的。

我不需要任何人为我编写代码 - 我会更感谢更有经验的开发人员或过去处理类似问题的任何人的反馈。

注意:以上内容经过编辑后更加清晰,但如果目前还不清楚,请与我们联系。

1 个答案:

答案 0 :(得分:3)

困难的问题取决于您的复杂程度:

  • 如果所有点计算器都已明确定义,则应该转向单表继承(STI)。最简单的案例。

  • 但是如果要求更大的灵活性,这就变得更难了,你应该考虑动态地包含方法,即DCI。这是最复杂的。请参阅以下详细信息。

例如:您在模型中的序列化对象中存储计算器行为列表:

behaviors = [ 'behavior1', 'behavior2' ]

每个行为都链接到具有相同名称的类或模块,例如:Behavior1Behavior2

然后,您可以在需要时随时向对象添加行为,例如在after_initialize中。

after_initialize :set_behaviors

def set_behaviors
  behaviors.each do |b|
    self.extend(b.constantize)
  end
end