如何对每个评论实施一次投票?

时间:2011-07-21 13:26:51

标签: ruby-on-rails ruby-on-rails-3 voting-system

我目前有一个评论控制器,其方法是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

这允许多次投票。我如何设计它,以便用户每条评论只能投票一次,但不知何故,如果他们投票或投票,他们会保持跟踪,这样他们就有能力改变他们的投票。

3 个答案:

答案 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 }