接下来是在我们的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 |
答案 0 :(得分: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
你明白了。这将是一种充分描述成就的方式。然后,您的观察者将能够使用您的achievement.rb类场景,以确定是否达到了成就。可以想象CanCan的工作方式。对于管理员来说,这也是一种很好的方式,可以通过比上面示例中提供的更简单的DSL编写简单的成就要求。
希望有所帮助,或至少给你一些想法:)
编辑:更简单的DSL
DSL可以非常简单和富有表现力,因此人们甚至可能喜欢用场景来编写场景。类似的东西:
comments :less_than => 10
check_comments
comments :more_or_equal => 100
award_hundred_comments_badge
这很容易形成一个有效的方案来实现100条评论。让我们想一想,如果用户邀请了10名性别为女性的人,就会获得徽章。
invites :less_than => 10, gender :female
check_invites
invites :equals => 10, gender :female
award_women_invitations_badge
现在,我认为即使对于没有关于ruby的线索的管理员来说,如果你向他们解释有关DSL的基本内容,这也很简单。但是如果你不希望他们进入那个,你可以创建一个如下形式的表单:
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, ....]