Как реализовать один голос на пользователя за комментарий? - PullRequest
5 голосов
/ 21 июля 2011

У меня в настоящее время есть контроллер комментариев, у которого есть методы voice_up и voice_down, вот как сейчас работает мой voice_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 ]

3 голосов
/ 21 июля 2011

Вы могли бы сделать что-то вроде этого. Он запрещает идентичные голоса, но позволяет изменить голосование на противоположное (это система «вверх / вниз»).

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 или любой другой.

2 голосов
/ 21 июля 2011
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
1 голос
/ 21 июля 2011

Вы могли бы, возможно, добавить проверку в вашей модели, чтобы убедиться, что число численно равно или меньше 1

validates :count, :numericality => { :less_than_or_equal_to => 1 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...