0

我正在尝试创建一个投票系统。正在投票的模型是问题,我有另一个名为 Vote 的模型,它拥有 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 的选票,并计算每个问题。也想知道总票数。我该怎么做?我在问题模式中的投票模型问题关联和 votes_count 列上设置了 counter_cache。这项工作应该在控制器还是模型中完成?

4

3 回答 3

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}")
于 2012-09-30T23:24:13.583 回答
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

于 2012-09-30T23:25:36.803 回答
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

(查看 - 哈姆)

= form_tag upvote_issue_path(@issue) do
  = submit_tag "Up"
= form_tag downvote_issue_path(@issue) do
  = submit_tag "Down"
于 2012-10-01T00:50:53.610 回答