【问题标题】:rails achievements轨道成就
【发布时间】:2012-02-27 16:19:54
【问题描述】:

然后是时候在我们的 Web 应用程序中实现某种成就了。我有一个或多或少类似于这个问题How to implement an achievement system in RoR 中描述的层次结构的想法。

我们正在开发的应用程序是一种软件即服务,旨在在没有软件开发人员的情况下进行外部管理。问题是软件管理员应该可以通过 Web 界面创建新的成就运行时。然后层次结构变成一堵墙。

我在某处读过可以通过有限状态机实现这种情况,但目前我没有足够的关于该主题的信息。

编辑:具体问题

我考虑过用一系列要满足的条件来建模一个成就类。这个基本类 Achievement 将有一个布尔值,它递归地检查所有条件是否有效。然后条件可以是硬编码的类。然后系统管理员使用原子条件的组合创建新的成就。

我担心原子条件的类越来越多。我不想在项目中有 30 多个条件类。任何建议都非常感谢。

编辑:有关实施的更多细节

根据 SpyrosP 的响应,构建所描述的 DSL 似乎是个好主意。然后必须以某种方式将成就保存在数据库中。保持相同的例子:

comments :less_than => 10
check_comments
comments :more_or_equal => 100
award_hundred_comments_badge 

为了动态地创建成就,应该有一个表来存储要检查的条件:

Achievement
| id | name                |
| 1  | "Houndred Comments" |

Condition
| achievement_id | expression             |  
| 1              | some sort of condition |

【问题讨论】:

  • StackOverflow 是针对有明确答案的特定编程问题。这个很主观。

标签: ruby-on-rails achievements


【解决方案1】:

我对同一个想法很感兴趣,并且前段时间读过不同的东西。可能最好的方法是使用观察者。观察者就像一个标准过滤器(before_filter 等),但有一些区别,比如如何处理返回值等等。

也就是说,如果您的系统真的很复杂,您可能想要使用像 https://github.com/pluginaweek/state_machine 这样的状态机插件。但是,我觉得这对于成就功能来说太过分了。

如果我不得不面对复杂的成就场景,我可能会创建一个简单的 DSL 来定义成就的行为。类似的东西:

for_achievement :hundred_comments do
  before_achievement :status => Comment, :lower_than => 100
  after_achievement :status => Comment, :more_or_equals => 100
end

你明白了。这将是一种全面描述成就的方式。然后,您的观察者将能够使用您的成就.rb 类场景,以确定是否达到了成就。想想 CanCan 的工作方式。这也可能是您的管理员通过比我在上面的示例中介绍的更简单的 DSL 编写简单的成就要求的好方法。

希望对你有所帮助,或者至少能给你一些想法:)

编辑:更简单的 DSL

DSL 可以非常简单且富有表现力,因此人们甚至可能喜欢用它来编写场景。类似的东西:

comments :less_than => 10
check_comments
comments :more_or_equal => 100
award_hundred_comments_badge

这很容易构成实现 100 cmets 的有效场景。让我们设想一个场景,如果用户邀请了 10 位女性,他将获得一个徽章。

invites :less_than => 10, gender :female
check_invites
invites :equals => 10, gender :female
award_women_invitations_badge

现在,如果您向他们解释有关 DSL 的基本内容,我认为即使对于不了解 ruby​​ 的管理员来说,这也很容易编写。但是,如果您不希望他们参与其中,您可以创建一个类似的表单:

Action Dropdown => [Comment, Invite, Post, ....]
Condition => [Equal, Less Than, More Than, ....]
Condition_Value => (TextBox to write value to)
CheckCondition => [Check Invitation Count, Check Messages Count, ....]

【讨论】:

  • 感谢您的回答。我真的很喜欢你的想法,我认为这是表达标准成就的绝佳方式。不过,我认为通过 Web 界面创建它们是不可行的,你怎么看?
  • 这主要取决于您为它创建 DSL 的方式。由于管理员对 ruby​​ 一无所知,因此您可以使 DSL 非常接近简单的英语,或者更好的是,通过简单的表单为他们生成代码。把它想象成有一个英文需求下拉列表,当您的管理员选择需求时,您只需将其堆积起来并创建 DSL 场景。我编辑了我的问题,以提出一个更简单的 DSL,您的管理员甚至可能会觉得写起来很有趣:)
  • 我无法访问互联网,很抱歉错过了回复。我认为 DSL 是帮助开发人员表达这些成就的好方法。我仍然想知道这个想法的实现。这些新成就,例如从 Web 界面创建的,将存储到数据库中。在您看来,实现这一目标的最佳方式是什么?我的意思是,在某种程度上,需要保存数据库列。我正在再次编辑我的问题以更清楚
  • 我仍然对“条件”列的实现有一个不透明的想法。它应该对其他模型有某种反映。你对此有什么想法吗?
  • 我要做的是直接将条件列与我的程序的特定属性相关联。例如,条件 'Check Invitation Count' 直接引用 Invitation.count,在 rails 术语中。
猜你喜欢
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多