我正在尝试创建一个投票系统。正在投票的模型是问题,我有另一个名为投票的模型,其中包含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。这项工作应该在控制器还是模型中完成?
答案 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)
你真的需要自己存票吗?如果您没有任何其他约束,则可以使用两个字段: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
(查看 - haml)
= form_tag upvote_issue_path(@issue) do
= submit_tag "Up"
= form_tag downvote_issue_path(@issue) do
= submit_tag "Down"