Rails 3 - votes as one integer value (to increase) or as a list/quantity of votes in database? Rails 3 - 投票作为一个整数值(用于增加)还是作为数据库中的一系列/数量的投票?
Rails 3 - votes as one integer value (to increase) or as a list/quantity of votes in database? Rails 3 - 投票作为一个整数值(用于增加)还是作为数据库中的一系列/数量的投票?
我是Rails的新手,目前正在开发一个应用,我的同学/校友们可以评论与我们相关的话题/问题,并且每条评论都可以进行投票(赞同或反对)。我为“赞同”和“反对”分别创建了一个模型。现在,在数据库中,我在犹豫,是应该为这两个投票模型设置一个单独的整数,可以增加,这样在控制器动作中就可以使用... += 1。还是应该使用一个投票的列表/集合,然后通过.count方法来显示赞同或反对的数量?
在这段对话中,问题的出现是因为讨论了如何在Rails 3中实现投票系统。原始问题是关于在数据库中将投票作为单个整数值(以增加)还是作为投票的列表/数量的问题。以下是问题的原因和解决方法的整理:
问题的原因:
- 应用程序的要求决定了你选择的选项。
- 如果不需要与投票相关的其他信息,可以将投票存储为模型中的单个整数。
- 如果需要存储与投票相关的其他信息(例如每个投票发生的时间和投票者),则可以为每个投票创建一个记录。
解决方法:
- 如果应用程序只需要收集赞成票和反对票的总数,可以在评论模型中创建一个属性,并使用单个整数来表示投票计数。
- 如果需要更多功能(例如验证、错误处理、日志记录等),则可以创建一个单独的投票模型。
关于如何处理投票机制和REST资源的问题:
- 为了更符合RESTful的设计,可以创建一个单独的模型来处理投票。
- 如果只需要计数,可以将其视为评论资源的属性。
- 如果需要更多功能,则应创建一个单独的模型。
关于在哪里处理赞成票和反对票的加减:
- 这应该在模型中完成(模型负责操作数据)。
最后,根据应用程序要求和功能需求,可以选择将投票存储为单个整数或作为投票的记录。
Rails中有一个特性叫做counter_cache,它可以在关联模型创建/删除时自动计算关联模型的数量。这是关于它的链接:http://guides.rubyonrails.org/association_basics.html,第4.1.2.4节。它通过在数据库中添加额外的列来实现。
非常感谢您的答案和有用的链接!这是一个很棒的指南。
原因:
问题的出现是因为在某些情况下,我们希望将投票作为一个整数值(用于增加)或作为数据库中的一系列/数量的投票来存储。这种情况可能会出现在需要对投票进行计数和聚合的应用程序中。
解决方法:
解决这个问题的一种方法是使用Rails的counter_cache特性。这个特性可以自动计算关联模型的数量,并将结果存储在一个额外的列中。通过使用counter_cache,我们可以轻松地增加或减少投票的数量,并且不需要手动更新数据库。
另一种解决方法是将投票作为数据库中的一系列/数量的记录来存储。这种方法可以提供更多的灵活性,可以方便地对投票进行查询和聚合。但是,这种方法可能需要更复杂的数据库查询和更多的存储空间。
无论选择哪种解决方法,都需要根据特定的应用程序需求和性能要求来权衡。
以下是使用counter_cache特性的示例代码:
首先,在模型中添加一个整数列用于存储投票计数:
class Post < ActiveRecord::Base has_many :votes, dependent: :destroy belongs_to :user, counter_cache: true end
接下来,创建一个migration来添加counter_cache列:
class AddVotesCountToUsers < ActiveRecord::Migration def change add_column :users, :votes_count, :integer, default: 0 end end
然后,在用户模型中启用counter_cache特性:
class User < ActiveRecord::Base has_many :posts end
现在,每当创建或删除关联的投票时,Rails会自动更新用户模型中的votes_count列。我们可以通过访问votes_count属性来获取投票的数量,而不需要执行额外的数据库查询。
希望本文对你理解Rails中投票计数的问题和解决方法有所帮助。