【问题标题】:Rails 3 - votes as one integer value (to increase) or as a list/quantity of votes in database?Rails 3 - 投票作为一个整数值(增加)还是作为数据库中的投票列表/数量?
【发布时间】:2012-05-26 17:04:07
【问题描述】:

我是 Rails 新手,目前正在开发一个应用程序,我的同学/同学可以在其中评论主题/问题(与我们相关),并且每个 cmet 都应该可以被投票赞成或反对。

我为“upvote”和“downvote”创建了一个自己的模型。

现在,在数据库中,我想知道,两个投票模型是否应该有一个整数可以增加,所以在我的控制器操作中,它应该是 ... += 1。 - 或者应该是简单地用 .count 方法计算的投票列表/集合以显示赞成或反对的价值?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    Rails 有一个名为 counter_cache 的功能,用于在创建/销毁时自动计算关联模型的数量。这是关于它的:http://guides.rubyonrails.org/association_basics.html 第 4.1.2.4 节。它是通过 DB 中的额外列完成的。

    【讨论】:

    • 非常感谢您的回答和有用的链接!这是一个很棒的指南。
    【解决方案2】:

    我认为您选择的选项取决于您的应用程序的要求。

    • 单整数
      • 如果您不需要与投票相关的任何其他信息,我只需将其作为单个整数存储在模型中。
    • 按投票记录
      • 如果您想在投票中存储其他信息,例如每次投票发生的人员和时间,那么您可以为每次投票创建记录。然后你可以在模型上做一个 .size (推荐 size over count for performance reasons... 或者更好,使用 jdoe 指出的 counter_cache)。

    话虽如此,从您的应用程序的描述来看,我认为赞成票和反对票不一定需要他们自己的模型。我会在您的 Comments 模型上为赞成和反对票创建一个属性,并使用单个整数来表示投票数。

    【讨论】:

    • 感谢您的详细解答!首先,我倾向于将其作为每个评论的单个整数,就像评论模型的额外属性一样。然后我找到了一些投票系统教程,他们经常使用自己的模型进行投票,这似乎是一个很棒且干净的解决方案,对于 REST 资源也是如此。老实说,看了你的帖子,我现在更倾向于单整数的方式了。我的应用程序应该只收集赞成票和反对票,仅此而已。我想要一个整体的 upvote 和 downvote 值,并且 cmets 的排序应该基于 upvote 和 downvote 的加减
    • 对于 REST 资源以及如何处理控制器中的投票机制,您认为更好的解决方案是什么?而且你认为每条评论的正负值应该是自己的属性甚至模型,还是简单地在控制器中瞬时计算?我更倾向于额外的属性甚至模型方式和 counter_cache 方法,它似乎更有效。抱歉问了这么多问题!
    • 就更加 RESTful 而言,创建一个单独的模型是可行的方法。然而,需要注意的是,投票资源需要有自己的模型。其他投票系统有自己独立的模型,因为它们contain a lot of other features。在您的情况下,如果您只需要计数,则可以将其视为 Comments 资源的属性。如果您想要更多(验证、错误处理、日志记录),那么我会使用单独的模型。
    • 至于在哪里处理加号/减号,属于模型(它负责操作数据;这也符合Fat Model, Skinny Controller)。希望这会有所帮助!
    • 非常感谢您的帮助!我想我会采用模型方式,因为我想将投票限制为每 24 小时投一次票,而且我以后可能想添加您所说的那些功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多