RoR投票系统。如何计票,减票和总票数?

时间:2012-09-30 23:18:26

标签: ruby-on-rails associations voting

我正在尝试创建一个投票系统。正在投票的模型是问题,我有另一个名为投票的模型,其中包含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关系。我想在每个问题的按钮旁边显示向上投票数和向下投票数。所以我需要为每个问题以vote = 1获得所有投票,以及所有投票= 0的投票,并计算每个投票。也想知道总票数。我该怎么做?我在我的问题架构中的投票模型问题关联和votes_count列上设置了counter_cache。这项工作应该在控制器还是模型中完成?

3 个答案:

答案 0 :(得分:1)

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}")

答案 1 :(得分:1)

我自己没有尝试过,但您应该尝试在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

答案 2 :(得分:1)

你真的需要自己存票吗?如果您没有任何其他约束,则可以使用两个字段: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

(查看 - haml)

= form_tag upvote_issue_path(@issue) do
  = submit_tag "Up"
= form_tag downvote_issue_path(@issue) do
  = submit_tag "Down"