[英]RoR voting system. Counting votes by condition vote = true or vote = false not working
我有这些模特
发出has_many票,并投票属居。 投票模型具有布尔投票属性。 在问题索引视图中,我想循环浏览问题,并显示标题,正文,向上投票按钮,向下投票按钮,以及分别显示当前有多少向上和向下投票的标签。 我使用带有issue_id和表决(1或0)隐藏字段的表单来执行此操作。 发行模型的方法应该计算票数。 但是我一直得到0返回。 Totalvotes_count有效,而其他两个无效。 在服务器日志中,我看到使用正确的issue_id和vote值创建的表决,但是由于某些原因查询不起作用。
问题模型
class Issue < ActiveRecord::Base
attr_accessible :body, :end_at, :title
validates_presence_of :title, :body, :end_at
has_many :votes
def upvotes_count
votes.count(:conditions => "vote = 1")
end
def downvotes_count
votes.count(:conditions => "vote = 0")
end
def totalvotes_count
votes.count
end
end
index.html.erb
<% @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 issue.upvotes_count.to_s + " 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 issue.downvotes_count.to_s + " Down", :class => 'down-vote' %>
<% end %>
</div>
</li>
<% end %>
投票控制人
class VotesController < ApplicationController
def index
@votes = Vote.find(:all, :include => :issue)
end
def new
@vote = Vote.new(params[:vote])
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @vote }
end
end
def create
@vote = Vote.new(params[:vote])
respond_to do |format|
if @vote.save
format.js
format.html { redirect_to issues_path }
else
format.html { redirect_to issues_path }
end
end
end
end
问题控制器(部分)
class IssuesController < ApplicationController
# GET /issues
# GET /issues.json
def index
@issues = Issue.all
@vote = Vote.new
respond_to do |format|
format.html # index.html.erb
format.json { render json: @issues }
end
结束
我相信您的问题是您没有在模型中的方法上调用“ self
”,但是正如tamersalama所提到的那样,这对于简单的投票跟踪而言可能是过大的。 在:upvote
和:downvote
属性上编写简单的+1方法可能是最简单的。
vote
的默认值为多少? 如果为NULL,则两者都不起作用。
更仔细地阅读问题-看起来vote
的价值决定了它是vote
还是反对。 我建议您对Vote
使用STI(单表继承)机制,在其中创建一个类型列以存储投票类型(:upvote,:downvote),并在type属性上建立索引。
但是,所有这一切似乎都不过分(取决于您域的其余部分)。 您只需将投票连同每个问题一起进行缓存。 一列赞成票和一票赞成票就足够了。 除非您想跟踪Vote上的其他属性(例如,喜欢投票的人)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.