我目前有一个评论控制器,其方法是vote_up和vote_down,这就是我的vote_up目前的工作方式。
我的评论模型有描述和计数字段。
def vote_up
@comment = Comment.find(params[:comment_id])
@comment.count += 1
if @comment.save
flash[:notice] = "Thank you for voting"
respond_to do |format|
format.html { redirect_to show_question_path(@comment.question) }
format.js
end
else
flash[:notice] = "Error Voting Please Try Again"
redirect_to show_question_path(@comment.question)
end
end
这允许多次投票。我如何设计它,以便用户每条评论只能投票一次,但不知何故,如果他们投票或投票,他们会保持跟踪,这样他们就有能力改变他们的投票。
答案 0 :(得分:3)
你可以这样做。它禁止相同的投票,但允许将投票改为相反的投票(这是一个竖起大拇指/拇指向下的系统)。
def vote(value, user) # this goes to your model
#find vote for this instance by the given user OR create a new one
vote = votes.where(:user_id => user).first || votes.build(:user_id => user)
if value == :for
vote_value = 1
elsif value == :against
vote_value = -1
end
if vote.value != vote_value
vote.value = vote_value
vote.save
end
end
迁移:
def self.up
create_table :votes do |t|
t.references :comment, :null => false
t.references :user, :null => false
t.integer :value, :null => false
end
add_index :votes, :post_id
add_index :votes, :user_id
add_index :votes, [:post_id, :user_id], :unique => true
end
或者,您可以使用名为thumbs_up
的宝石或其他任何宝石。
答案 1 :(得分:2)
class AnswersController < ApplicationsController
def vote
#params[:answer_id][:vote]
#it can be "1" or "-1"
@answer = Answer.find(params[:answer_id])
@answer.vote!(params[:answer_id][:vote])
end
def show
@answer = Answer.find(params[:answer_id])
@answer.votes.total_sum
end
end
class Answer < ActiveRecord::Base
has_many :votes do
def total_sum
votes.sum(:vote)
end
end
def vote!(t)
self.votes.create(:vote => t.to_i)
end
end
class Vote < ActiveRecord::Base
belongs_to :answer
belongs_to :user
validates_uniqueness_of :user_id, :scope => :answer_id
end
答案 2 :(得分:1)
您可以在模型中添加验证,以确保计数在数值上等于或小于1
validates :count, :numericality => { :less_than_or_equal_to => 1 }