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

ran*_*its 21 ruby ruby-on-rails achievements

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

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

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

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

Cor*_*ren 60

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

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

  1. 徽章
  2. 行列

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

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

在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
Run Code Online (Sandbox Code Playgroud)

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

它支持ActiveRecord和Mongoid.

荣耀的道路

荣耀之路Badgeable完全不同.这个宝石更倾向于积分排名.它将逻辑与逻辑分开来计算徽章(观察者)以描述徽章(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
Run Code Online (Sandbox Code Playgroud)

观察者部分非常经典:

  observe :post

  def after_save(post)
    Teacher.award_achievements_for(post.user) unless post.new_record?
  end
Run Code Online (Sandbox Code Playgroud)

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

它包括帮助者,以跟踪进展到下一个级别.由于它使用经典的导轨功能,因此它应与所有可用的导轨ORM兼容.

值得

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

对于徽章,它看起来像:

grant_on ['users#create', 'users#update'], :badge => 'autobiographer', :temporary => true do |user|
  user.name.present? && user.address.present?
end
Run Code Online (Sandbox Code Playgroud)

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

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

score 20, :on => [ 'comments#create', 'photos#create' ]
Run Code Online (Sandbox Code Playgroud)

对于排名,它与徽章非常相似.差异主要是在级别:

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
Run Code Online (Sandbox Code Playgroud)

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

task :cron => :environment do
  MeritRankRules.new.check_rank_rules
end
Run Code Online (Sandbox Code Playgroud)

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