gpt4 book ai didi

ruby-on-rails - 如何在 RoR 中实现成就系统

转载 作者:行者123 更新时间:2023-12-03 07:16:36 25 4
gpt4 key购买 nike

我正在尝试在我的 Ruby on Rails 应用程序中实现一个成就系统,但效果很差。

我有一长串想要检查的成就。所有这些都是由各种 Controller 中的某些创建操作触发的。

我的想法是我将拥有一个成就模型,其中包括 Controller 及其响应的操作。然后对创建进行之前过滤并检查适用的成就。当涉及到实际定义/执行成就时,我陷入了困境。每个成就可能需要不同的数据。例如,一个人想知道用户回答了多少个问题,另一个人想知道他们发表了多少条评论,第三个想知道用户邀请的有多少人做出了回应。

最好的做法是将所有必要的 ruby​​ 代码直接嵌入到数据库中吗?我可以看到做一个自包含 block 来执行所有事件记录查找等并返回 true/false,尽管我们仍然存在一些关于提前了解设置的问题(即 current_user 等)。

有什么合理的最佳实践不会让我感到肮脏吗?我可以看到完整的策略/规则引擎是一种路径,尽管这可能比计划 a 更让我害怕。

谢谢!奥伦

最佳答案

我同意您使用成就模型的想法。

不过,您可能不应该在 Controller 中实现触发器。想象一下,您有两种发表评论的方式;你将不可避免地得到代码重复。这种行为属于模型。

假设您想要跟踪用户发表的评论数量,并为 100 条评论授予成就。您可以拥有以下模型:

class User < ActiveRecord::Base
has_many :comments
has_many :achievements

def award(achievement)
achievements << achievement.new
end

def awarded?(achievement)
achievements.count(:conditions => { :type => achievement }) > 0
end
end

class Achievement < ActiveRecord::Base
belongs_to :user
end

class Comment < ActiveRecord::Base
belongs_to :user
end

class CommentAchievement < Achievement
def self.check_conditions_for(user)
# Check if achievement is already awarded before doing possibly expensive
# operations to see if the achievement conditions are met.
if !user.awarded?(self) and user.comments.size > 100
user.award(self)
end
end
end

不同的成就都是Achievement模型的子类,并且使用单表继承,因此它们只存储在一张表中。子类可以包含每个单独成就所需的所有逻辑。您还可以在此模型中存储其他信息,例如授予成就的日期。为了确保数据库拒绝重复的成就,您可以在 typeuser_id 列上创建一个 UNIQUE 索引。

CommentAchievement.check_conditions_for(user) 可以随时调用。您可以创建一个时不时运行的后台作业,也可以创建一个观察者:

# app/models/comment_achievement_observer.rb
class CommentAchievementObserver < ActiveRecord::Observer
observe :comment

def after_create(comment)
CommentAchievement.check_conditions_for(comment.user)
end
end

# config/environment.rb
config.active_record.observers = :comment_achievement_observer

以上只是一种思路,当然可能还有其他的。该代码只是一个示例,我还没有实际测试过。希望对您有所帮助。

关于ruby-on-rails - 如何在 RoR 中实现成就系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/885277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com