[英]Designing a points based system similar to Stack Overflow in Ruby on Rails
我并没有尝试重新创建Stack Overflow,并且确实查看了类似的问题,但是它们没有很多答案。
我对如何设计Rails应用程序(尤其是模型及其关联)感兴趣,以便捕获各种不同类型的动作及其积分。 此外,这些点会随着时间的流逝而衰减,并且可能存在其他动作或我正在跟踪的其他数据形式的修饰符。
例如,如果我正在设计Stack Overflow(我又不是),它将类似于以下内容。
从设计的角度来看,我觉得关键零件需要3个模型。
动作模型是多态的,因此它可以属于问题,答案或任何其他内容。 关联的类型存储在类型字段中。 它还包含一个点字段,该点字段是在创建时通过对点模型进行查找而计算出来的,我将在下面讨论。 它还应该更新用户模型的总积分,在此不做讨论。
积分模型是一个查找表,操作可用来计算其积分。 它使用操作类型作为键。 它还存储点的数量和衰减的字段。
修改器模型是我不确定该怎么做的模型。 我认为它可能也应该是一个查找表,就像使用动作的type字段的要点一样。 此外,它还需要某种条件来决定何时应用。 我不确定如何存储条件语句。 它还需要存储如何修改点。 例如x2,+ 5,-10,/ 100等。另一个问题是在发生动作后如何应用修饰符。 在我的示例中,就是选择一个问题作为答案。 到此时,这些点已经设定好了。 我能想到的唯一方法是在每个可能有修饰符的模型上都有一个after_save,它检查修饰符表并应用它们。 我觉得这有点不对劲。
还有其他问题,例如如何处理衰减。 我想我需要一份仅能重新计算每个人的积分但似乎无法很好地扩展的Cron作业。
我不确定我是否在考虑这个问题或其他问题,但是我需要一些反馈。
我倾向于使用log-aggregate-snapshot,在其中您记录离散事件,然后定期聚合更改并将其存储在单独的表中。 这将允许您将诸如衰变之类的事情作为插入工作而不是更新工作来处理。 根据投票数的多少,您甚至可以将其汇总起来,然后从特定角度向前滚动(尽管每个问题或答案可能不足以引起关注),但是鉴于您可能还有其他事情,例如跟踪用户的总点数,这可能是个好快照。
但是,我认为您需要先弄清楚如何处理衰减,然后再在汇总快照表中进行处理。
现在,Rails具有实现此功能的宝石
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.