Ruby on rails 设计一个类似RubyonRails中堆栈溢出的基于点的系统

Ruby on rails 设计一个类似RubyonRails中堆栈溢出的基于点的系统,ruby-on-rails,database-design,points,Ruby On Rails,Database Design,Points,我并没有试图重新创建堆栈溢出,我也看到过类似的问题,但它们没有太多的答案 我对如何设计rails应用程序感兴趣,特别是模型及其关联,以便捕获各种不同类型的动作及其点数。此外,这些点会随着时间的推移而衰减,我正在跟踪的其他动作或其他数据中可能存在修改器 例如,如果我正在设计堆栈溢出(我也不是这样),它将如下所示 创建问题=5分 回答问题=10分 选择的正确答案是回答问题的分数上的x2修饰符 从设计的角度来看,我似乎需要3个模型的关键部分 动作模型是多态的,因此它可以属于问题、答案或其他类型。关联类

我并没有试图重新创建堆栈溢出,我也看到过类似的问题,但它们没有太多的答案

我对如何设计rails应用程序感兴趣,特别是模型及其关联,以便捕获各种不同类型的动作及其点数。此外,这些点会随着时间的推移而衰减,我正在跟踪的其他动作或其他数据中可能存在修改器

例如,如果我正在设计堆栈溢出(我也不是这样),它将如下所示

  • 创建问题=5分
  • 回答问题=10分
  • 选择的正确答案是回答问题的分数上的x2修饰符
  • 从设计的角度来看,我似乎需要3个模型的关键部分

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

    模型是一个查找表,在该表中操作可以找出它们的点。它使用actions类型作为键。它还存储点的数量及其衰减的字段

    修饰符模型是我不确定如何处理的模型。我认为它应该是一个查找表,类似于使用动作类型字段的点。此外,它还需要某种条件来决定何时应用它。我不知道如何存储条件语句。它还需要存储点的修改方式。例如x2、+5、-10、/100等。另一个问题是,在动作已经发生之后,如何应用修改器。在我的例子中,当选择一个问题作为答案时。这时,积分已经设定好了。我能想到的唯一方法是对每个模型进行事后保存,该模型可能是一个修改器,用于检查修改器表并应用它们。但我觉得这似乎有点不对

    还有其他问题,比如如何处理衰变。我想我需要一个cron作业,它只是重新计算每个人的点,但它似乎不能很好地扩展


    我不确定我是否考虑过度了,但我希望得到一些反馈。

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


    但是,我认为在聚合快照表中处理衰退之前,您需要弄清楚如何处理衰退。

    现在Rails已经有了gem来实现这一功能


    只是一个想法。。。当用户登录时,您总是可以看到“衰退”点(进行初步检查,一些家庭维护等)。这样的话,它将在每个用户的基础上扩展,而那些不访问的用户,他们的积分不会衰减,直到他们回来。然而,如果你正在寻找平均分数等,这可能会影响统计数据。因此有一个缺点。这是一个有趣的想法,但我可能会做一些排序,以便至少每天都会发生衰减。重要问题:为什么你希望分数衰减?我猜答案大概是“因为我们希望人们保持活跃,比不活跃的人更重要”或类似的。。。然而,考虑到衰退点所带来的非常强烈的负面强化:一段时间后,许多用户会意识到有一个红色的女王效应-他们不得不花费大量的时间仅仅停留在一个地方…这对你更有经验的人来说是一个很大的打击(比如那些在你的网站之外有生活的人)。。。现在,也许你还有其他很好的理由,但一定要权衡一下你会给想要加入的人带来的巨大负面障碍。就我个人而言,我几乎永远不会加入一个我的分数下降的网站。。。所有这些辛苦的工作都白费了,仅仅是因为你想强迫别人产生一种虚假的紧迫感?不,谢谢这些评论是相关的,因为-如果你不担心衰变,只要找到其他方法鼓励你的用户定期访问网站,你的问题就会变得容易得多。所以这不是我喜欢的方法,但这是我得到的最好的答案,所以我会给你。我并没有完成这个项目,但我正在做一些事情,现在我可能会使用这样的系统。我宁愿使用其他人现有的声誉引擎,但我不认为有任何好的。