如何'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::Score
和Merit::Sash
table,但我不清楚它们的作用以及是否也需要创建这些记录。
还有什么我忽略的吗?
顺便说一句,Merit::Action.action_value
、Merit::ActivityLog.description
和 Merit::Score::Point.log
的目的是什么,或者这些只是自由文本字符串?
Merit 能够根据 Merit::Action
重新计算每个用户的声誉。在 this Whosebug answer 中,您可以看到使用 merit 的现有应用程序如何:
- 删除与用户相关的所有日志、徽章和授予的积分
- 将所有操作标记为
processed: false
- 重新计算现在未处理的规则
在您的特定情况下,您唯一想要创建的 Merit 模型是 action
,并将其初始化为 processed: false
而不是 true
。 Merit::Action.check_unprocessed
然后应该重新创建您寻求的声誉。
This wiki article 解释了价值内部机制可能会帮助您理解这些步骤背后的逻辑。
Merit::Action.action_value
、Merit::ActivityLog.description
、Merit::Score::Point.log
在功德上没有任何有意义的行为,需要时可以使用。
我正在尝试使用 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::Score
和Merit::Sash
table,但我不清楚它们的作用以及是否也需要创建这些记录。
还有什么我忽略的吗?
顺便说一句,Merit::Action.action_value
、Merit::ActivityLog.description
和 Merit::Score::Point.log
的目的是什么,或者这些只是自由文本字符串?
Merit 能够根据 Merit::Action
重新计算每个用户的声誉。在 this Whosebug answer 中,您可以看到使用 merit 的现有应用程序如何:
- 删除与用户相关的所有日志、徽章和授予的积分
- 将所有操作标记为
processed: false
- 重新计算现在未处理的规则
在您的特定情况下,您唯一想要创建的 Merit 模型是 action
,并将其初始化为 processed: false
而不是 true
。 Merit::Action.check_unprocessed
然后应该重新创建您寻求的声誉。
This wiki article 解释了价值内部机制可能会帮助您理解这些步骤背后的逻辑。
Merit::Action.action_value
、Merit::ActivityLog.description
、Merit::Score::Point.log
在功德上没有任何有意义的行为,需要时可以使用。