用于构建成就系统的Ruby / Rails的现代工具

我有兴趣为我的Ruby on Rails应用程序构建一个强大的成就系统。

成就可以以无数种方式发生。 通常情况下,我们会有一些标准可能发生在几个模型上,一些是必需的,一些是可选的(混合和匹配)触发成就。

我会说这类似于这里的成就系统或Foursquare徽章。 理想情况下,如果有一个现代工具可以帮助抽象一些DSL中的大量工作,那将是非常棒的。

我很想知道其他人如何使用Ruby或Ruby on Rails解决这个问题。 从头开始构建这听起来不合理,因为我确信它已经反复多次解决。

成功系统乍一看似乎很简单,但很快就会变得非常复杂。

首先,您必须确定要提供的成就类型。 你可以奖励:

  1. 徽章
  2. 行列

当然,你也想要做出各种组合。 不明显但经常被问到的function是:

  • 能够知道其在特定等级徽章上的进展。
  • 隐藏一些徽章的能力

在RoR世界中,我发现了3个免费提供的第三方库。 通常,没有灵丹妙药,你必须根据自己的需要选择一个。

Badgeable

Badgeable是一个简单的DSL,只实现徽章系统。 它的动态和简单易懂。 这个例子来自官方文档:

badge "Fancy Pants" do thing Meal subject :person count Meal.where(:price_cents.gte => 10000).count >= 12 end conditions do |meal| meal.restaurant.city != meal.eater.city end end 

它会将Fancy Pants徽章奖励给吃了12顿昂贵餐点的用餐者,那里的餐点不在城里。 它包括有趣的function,如看不见的徽章,但不能奖励相同的徽章倍数倍。 默认情况下,Badgeable在创建观察记录后添加挂钩。 在上面的示例中,徽标条件在每次创建膳食后执行。

它支持ActiveRecord和Mongoid。

荣耀的道路

荣耀之路与Badgeable完全不同。 这个gem更倾向于积分排名 。 它将逻辑与逻辑分开来计算徽章(观察者)以描述徽章(Achivement class)。 如果您已经使用Observer模式,也许对您来说更自然。 请注意,它是纯Ruby,在荣耀之路中没有DSL。

在成就课程中,您可以描述您的等级,您的数量以及如何奖励成就:

 level 1, :quota => 2 level 2, :quota => 4 level 3, :quota => 6 set_thing_to_check { |user| user.posts.count } def self.award_achievements_for(user) return unless user return if user.has_achievement?(self) user.award_achievement(self) end 

观察者部分非常经典:

  observe :post def after_save(post) Teacher.award_achievements_for(post.user) unless post.new_record? end 

它没有很好的文档,但你可以在这里找到一个使用它的示例应用程序。

它包括帮助者,以便跟进进度到下一个等级 。 由于它使用经典的导轨function,因此它应与所有可用的导轨ORM兼容。

值得

优点似乎是关于这个主题,ATM的更完整的gem。 它允许使用DSL定义徽章规则

对于徽章,它看起来像:

 grant_on ['users#create', 'users#update'], :badge => 'autobiographer', :temporary => true do |user| user.name.present? && user.address.present? end 

如果用户输入了地址,它将检查创建和更新。 如果用户删除了地址,它将删除徽章。

对于积分,它可以根据多个模型计算得分

 score 20, :on => [ 'comments#create', 'photos#create' ] 

对于排名,它与徽章非常相似。 差异主要在于水平

 set_rank :stars, :level => 2, :to => Commiter.active do |commiter| commiter.branches > 1 && commiter.followers >= 10 end set_rank :stars, :level => 3, :to => Commiter.active do |commiter| commiter.branches > 2 && commiter.followers >= 20 end 

此gem还提供了计算cron作业中的徽章或排名的方法,而不是在每次写入对象之后:

 task :cron => :environment do MeritRankRules.new.check_rank_rules end 

在引擎盖下, Merit使用Ambry来存储徽章信息。 它应该有助于减少数据存储上的噪音并使其更快一些。 MongoMapper有一个实验支持。 我没有找到任何手段来获得看不见的徽章或跟踪徽章的进展。

如果您需要全面的解决方案,twitter人员可以使用activerecord-reputation-system

你看过Badgeable吗?

你可以使用像http://www.badgeville.com/这样的东西