2011-07-21 25 views
5

Tôi hiện có bộ điều khiển nhận xét có phương thức vote_up và vote_down đây là cách vote_up của tôi hiện đang hoạt động.Làm cách nào để thực hiện một phiếu bầu cho mỗi người dùng cho mỗi nhận xét?

Mô hình nhận xét của tôi có mô tả và trường đếm.

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 

Điều này cho phép nhiều phiếu bầu lên xuống. Làm thế nào tôi sẽ thiết kế nó để người dùng chỉ có thể bình chọn một lần cho mỗi bình luận nhưng bằng cách nào đó theo dõi nếu họ bỏ phiếu lên hoặc xuống, vì vậy họ có khả năng thay đổi phiếu bầu nếu họ muốn.

+0

cũng lưu ý rằng có nhiều kết quả được tìm thấy từ việc tìm kiếm 'một phiếu bầu cho mỗi người dùng' trên SO – KevinDTimm

+0

Bạn sẽ cần một mô hình khác để theo dõi phiếu bầu. Bạn có thể sử dụng các ràng buộc duy nhất để chỉ cho phép một phiếu bầu cho mỗi người dùng, đó chính xác là câu trả lời của Mikhailov. –

+0

Tôi đã đọc qua câu trả lời đó nhưng làm thế nào tôi có thể làm cho nó để người dùng được phép thay đổi phiếu bầu của mình sau này? Cho phép nói từ -1 đến 1 – Kevin

Trả lời

3

Bạn có thể làm một cái gì đó như thế này. Nó cấm các phiếu bầu giống hệt nhau nhưng cho phép thay đổi phiếu bầu đối diện với nhau (đó là hệ thống không thích hợp).

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 

di cư:

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 

Ngoài ra, bạn có thể sử dụng một viên ngọc gọi thumbs_up hoặc bất kỳ khác.

+0

Cảm ơn vì điều này tôi đã sử dụng phương pháp này với một số sửa đổi khác mà tôi nhận được từ @mikhailov và tôi đã nhận nó để cuối cùng làm việc – Kevin

1

bạn có lẽ có thể thêm một xác nhận trong mô hình của bạn để chắc chắn rằng số đó là số lượng bằng hoặc nhỏ hơn 1

validates :count, :numericality => { :less_than_or_equal_to => 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 
+0

Tôi đã tìm thấy tôi cần một mô hình khác cho phiếu bầu nhưng làm cách nào để tôi thực hiện một cách để cho phép người dùng thay đổi phiếu bầu của mình sau này? – Kevin

+0

** cập nhật ** hành động sẽ tìm thấy bình chọn theo câu trả lời và id người dùng, sau đó cập nhật phiếu bầu của mình – Anatoly

+0

Bạn cần thổi phồng một chút: Có tệp di chuyển và mô hình cho phiếu bầu của bạn. Thuộc tính: [id], user_id: số nguyên, chú thích_id: số nguyên, is_up: boolean; sau đó bạn có thể có một phạm vi (hoặc chức năng lớp) trong mô hình Vote của bạn để trả về số lượng bình chọn lên/xuống cho một nhận xét nhất định. Quan trọng hơn: bạn có thể theo dõi người dùng nào đã bỏ phiếu cho nhận xét nào - và cho phép người dùng thay đổi phiếu bầu của mình! – emrass

Các vấn đề liên quan