繁体   English   中英

RoR投票系统。 如何计算上,下,总票数?

[英]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

您真的需要自己存储选票吗? 如果没有其他限制,则可以使用两个字段: upvotesdownvotes 然后定义两个动作“ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM