ran*_*its 21 ruby ruby-on-rails achievements
我有兴趣为我的Ruby on Rails应用程序构建一个强大的成就系统.
成就可以以无数种方式发生.通常情况下,我们会有一些标准可能发生在几个模型上,一些是必需的,一些是可选的(混合和匹配)触发成就.
我会说这类似于这里的成就系统或Foursquare徽章.理想情况下,如果有一个现代工具可以帮助抽象出一些DSL中的大量工作,那将是非常棒的.
我很想知道其他人如何使用Ruby或Ruby on Rails解决这个问题.从头开始构建这听起来不合理,因为我确信它已经反复多次解决.
Cor*_*ren 60
成功系统乍一看似乎很简单,但很快就会变得非常复杂.
首先,您必须确定要提供的成就类型.你可以奖励:
当然,你也想要做出各种组合.不明显但经常被问到的功能是:
在RoR世界中,我发现了3个免费提供的第三方库.通常,没有灵丹妙药,你必须根据自己的需要选择一个.
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有一个实验支持.我没有找到任何手段来获得看不见的徽章或跟踪徽章的进展.
| 归档时间: |
|
| 查看次数: |
4384 次 |
| 最近记录: |