0

我不是想重新创建 Stack Overflow,我确实看过类似的问题,但他们没有很多答案。

我对如何设计一个 Rails 应用程序很感兴趣,尤其是模型及其关联,以便捕获各种不同类型的动作及其分数。此外,这些点会随着时间的推移而衰减,并且可能会以其他操作或我正在跟踪的其他数据的形式出现修饰符。

例如,如果我正在设计 Stack Overflow(我又不是),它会如下所示。

  1. 创建一个问题 = 5 分
  2. 回答一个问题 = 10 分
  3. 选择的正确答案是回答问题分数的 x2 修饰符。

从设计的角度来看,在我看来,关键部件需要 3 个模型。

动作模型是多态的,因此它可以属于问题、答案或其他任何内容。关联类型存储在类型字段中。它还包含一个 points 字段,该字段在创建时通过在 points 模型中的查找来计算,我将在接下来讨论。它还应该更新用户模型的总分,我不会在这里讨论。

点数模型是一个查找表,动作用来找出他们的点数。它使用动作类型作为键。它还存储点的数量和衰减的字段。

修改器模型是我不确定如何处理的模型。我认为它可能应该是一个查找表,也像使用操作的类型字段的点。此外,它需要某种条件来决定何时应用它。我不确定如何存储条件语句。它还需要存储点是如何修改的。例如 x2、+5、-10、/100 等。另一个问题是在动作已经发生后如何应用修饰符。在我的示例中,它将是当一个问题被选为已回答时。到这个时候,分数已经确定了。我能想到的唯一方法是在每个模型上都有一个 after_save ,它可能是一个修改器,它检查修改器表并应用它们。不过,这对我来说似乎是错误的。

还有其他问题,例如如何处理衰减。我想我需要一个 cron 工作来重新计算每个人的分数,但这似乎不能很好地扩展。

我不确定我是否在想这个或什么,但我想要一些反馈。

4

2 回答 2

0

我倾向于使用日志聚合快照,您可以在其中记录离散事件,然后定期汇总更改并将其存储在单独的表中。这将允许您将诸如衰减之类的事情作为插入作业而不是更新作业来处理。根据有多少票,您甚至可以随着时间的推移汇总它们并从特定点向前滚动(尽管每个问题或答案可能没有足够的问题来解决这个问题)但考虑到您可能还有其他事情就像用户要跟踪的总点数一样,快照可能是一件好事。

但是,我认为在汇总快照表中解决衰减之前,您需要弄清楚如何处理衰减。

于 2013-04-05T03:35:55.693 回答
0

现在 Rails 有 gem 来实现这个功能

https://github.com/tute/merit

于 2014-09-01T10:34:29.370 回答