【问题标题】:Rails Model for flexible points system用于灵活点系统的 Rails 模型
【发布时间】:2012-09-08 03:10:24
【问题描述】:

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

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

  • 每个用户的“积分计算器”逻辑可能不同。例如,一个用户每次连续玩一个多小时可能会额外获得 100 分。另一位用户可能会在晚上 8 点到 10 点之间获得双倍积分。

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

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

注意:以上内容已经过编辑以更加清晰,但如果仍不清楚,请告诉我。

【问题讨论】:

  • 我无法理解您想要达到的目标,您能否更详细地解释一下。以便其他人也能更好地理解

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


【解决方案1】:

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

  • 如果所有积分计算器都定义明确,您应该使用单表继承 (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

【讨论】:

  • 我真的非常喜欢这个主意。我实际上打算将 PointsCalculatorAlgorithm 实现为一个单独的模型来存储不同的行为,但是您的第二种方法似乎更干净。非常感谢您的帮助!
猜你喜欢
  • 2013-06-28
  • 2011-06-04
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多