我很难尝试在我的Ruby on Rails应用程序中实现一个成就系统.
我有很多我想要检查的成就.所有都是由各种控制器中的一些创建动作触发的.
我有一个想法,我将有一个成就模型,其中包括控制器和它响应的动作.然后为创建过滤器,检查适用的成就.在实际定义/执行成就时,我会陷入困境.每项成就可能需要不同的数据.例如,人们想要知道用户已经回答了多少问题,另一个问题是他们做出了多少评论,以及第三个用户邀请了多少人回答了问题.
实际上只需将所有必要的ruby代码直接嵌入到DB中,这是最好的做法吗?我可以看到做一个自包含块来执行所有活动记录查找等,并返回true/false,尽管我们仍然存在一些关于事先知道什么是设置的问题(即current_user等).
任何合理的最佳做法都不会让我感到肮脏?我可以看到一个完整的策略/规则引擎是一条路径,虽然这可能会吓到我而不是计划一个.
谢谢!奥伦
我有兴趣为我的Ruby on Rails应用程序构建一个强大的成就系统.
成就可以以无数种方式发生.通常情况下,我们会有一些标准可能发生在几个模型上,一些是必需的,一些是可选的(混合和匹配)触发成就.
我会说这类似于这里的成就系统或Foursquare徽章.理想情况下,如果有一个现代工具可以帮助抽象出一些DSL中的大量工作,那将是非常棒的.
我很想知道其他人如何使用Ruby或Ruby on Rails解决这个问题.从头开始构建这听起来不合理,因为我确信它已经反复多次解决.
我正试图在Ruby on Rails中设计一个成就系统,并且遇到了我的设计/代码.
试图使用多态关联:
class Achievement < ActiveRecord::Base
belongs_to :achievable, :polymorphic => true
end
class WeightAchievement < ActiveRecord::Base
has_one :achievement, :as => :achievable
end
Run Code Online (Sandbox Code Playgroud)
迁移:
class CreateAchievements < ActiveRecord::Migration
... #code
create_table :achievements do |t|
t.string :name
t.text :description
t.references :achievable, :polymorphic => true
t.timestamps
end
create_table :weight_achievements do |t|
t.integer :weight_required
t.references :exercises, :null => false
t.timestamps
end
... #code
end
Run Code Online (Sandbox Code Playgroud)
然后,当我尝试下面的抛弃单元测试时,它会失败,因为它表示该成就为空.
test "parent achievement exists" do
weightAchievement = WeightAchievement.find(1)
achievement = weightAchievement.achievement
assert_not_nil achievement
assert_equal 500, weightAchievement.weight_required
assert_equal …Run Code Online (Sandbox Code Playgroud)