如何'back calculate'功德分?

How to 'back calculate' Merit points?

我正在尝试使用 Merit 将信誉系统添加到现有应用中。

我想根据所有用户的历史 activity 回算所有用户的积分。 Merit 的内部结构相当复杂,有几个 table,我想我可能遗漏了一些重要的步骤。以下是我目前所掌握的内容,非常感谢任何对此更熟悉的人的指点 gem。

为简单起见,假设我想

score 2, to: :user, on: 'comments#create'

并且我有一条评论 table 满是看起来像这样的记录

Comment id: 56, content: "My comment", user_id: 247, commentable_id: 2, commentable_type: 'Object', created_at: "2016-04-04 08:56:17", updated_at: "2016-04-04 17:03:55">

我目前的做法是这样的

Comment.all.each do |c|
  score_point = Merit::Score::Point.create( num_point: 2, log: nil, created_at: c.created_at)
  action = Merit::Action.create(user_id: c.user_id, action_method: 'create', action_value: nil, had_errors: false, target_model: c.class.name, target_id: c.id, processed: true, created_at: c.created_at)
  activity_log = Merit::ActivityLog.create( action_id: action.id, related_change_type: "Merit::Score::Point", related_change_id: score_point.id, description: "", created_at: c.created_at) 
end

还有Merit::ScoreMerit::Sashtable,但我不清楚它们的作用以及是否也需要创建这些记录。

还有什么我忽略的吗?

顺便说一句,Merit::Action.action_valueMerit::ActivityLog.descriptionMerit::Score::Point.log 的目的是什么,或者这些只是自由文本字符串?

Merit 能够根据 Merit::Action 重新计算每个用户的声誉。在 this Whosebug answer 中,您可以看到使用 merit 的现有应用程序如何:

  1. 删除与用户相关的所有日志、徽章和授予的积分
  2. 将所有操作标记为processed: false
  3. 重新计算现在未处理的规则

在您的特定情况下,您唯一想要创建的 Merit 模型是 action,并将其初始化为 processed: false 而不是 trueMerit::Action.check_unprocessed 然后应该重新创建您寻求的声誉。

This wiki article 解释了价值内部机制可能会帮助您理解这些步骤背后的逻辑。


Merit::Action.action_valueMerit::ActivityLog.descriptionMerit::Score::Point.log在功德上没有任何有意义的行为,需要时可以使用。