[英]RoR voting system. How to count up votes, down votes, and total votes?
我正在尝试创建一个投票系统。 正在投票的模型是“问题”,而我还有另一个名为“投票”的模型,该模型具有issue_id和0或1的投票值。正在使用具有隐藏字段的表单来创建投票。 这是在问题索引视图上。
<h1>Votes</h1>
<% @issues.each do |issue| %>
<li>
<div class="issue">
<h2><%= issue.title %></h2>
<p><%= issue.body %></p>
<%= form_for(@vote, :remote => true) do |f| %>
<%= f.hidden_field "issue_id", :value => issue.id %>
<%= f.hidden_field "vote", :value => 1 %>
<%= submit_tag "Up", :class => 'up-vote' %>
<% end %>
<%= form_for(@vote, :remote => true) do |f| %>
<%= f.hidden_field "issue_id", :value => issue.id %>
<%= f.hidden_field "vote", :value => 0 %>
<%= submit_tag "Down", :class => 'down-vote' %>
<% end %>
</div>
</li>
<% end %>
问题和投票之间存在has_many和belongs_to关系。 我想在每个问题的按钮旁边显示赞成和反对的数目。 因此,我需要为每个问题拉动所有具有表决权= 1的投票以及所有具有表决权= 0的投票,然后对每个投票进行计数。 也想知道总票数。 我应该怎么做? 我在问题模式中的投票模型问题关联和voice_count列上设置了counter_cache。 应该在控制器还是模型中完成这项工作?
ActiveRecord具有应执行您想要的操作的count
方法: http : //api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-count
例如,在您的控制器中:
@upvotes_count = Vote.count(:conditions => "issue_id = #{@issue.id} AND value = 1")
@downvotes_count = Vote.count(:conditions => "issue_id = #{@issue.id} AND value = 0")
@allvotes_count = Vote.count(:conditions => "issue_id = #{@issue.id}")
我自己还没有尝试过,但是您应该尝试向“ Issue
模型中添加一些方法,如下所示:
def upvote_count
votes.count(:conditions => "value = 1")
end
def downvote_count
votes.count(:conditions => "value = 0")
end
我在Rails文档中了解了这一点。 您可以在这里自己看到:
http://ar.rubyonrails.org/classes/ActiveRecord/Calculations/ClassMethods.html http://apidock.com/rails/ActiveRecord/Associations/CollectionAssociation/count
您真的需要自己存储选票吗? 如果没有其他限制,则可以使用两个字段: upvotes
和downvotes
。 然后定义两个动作“ upvote”和“ downvote”,它们会将相应的字段更新1。您可以使用类似的方法原子地完成此操作。
(模型)
class Issue < AR::Base
def self.upvote(id)
self.where(:id => id).update_all("upvotes = upvotes + 1")
end
def self.downvote(id)
self.where(:id => id).update_all("downvotes = downvotes + 1")
end
end
(控制器)
class IssuesController < ApplicationController
def upvote
Issue.upvote(params[:id])
end
def downvote
Issue.upvote(params[:id])
end
end
(路由器)
resources :issues do
member do
post :upvote
post :downvote
end
end
(视图-哈姆勒)
= form_tag upvote_issue_path(@issue) do
= submit_tag "Up"
= form_tag downvote_issue_path(@issue) do
= submit_tag "Down"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.