2011-07-21 17 views
5

मेरे पास वर्तमान में एक टिप्पणी नियंत्रक है जिसमें विधि_अप और वोट_डाउन विधि है, इस प्रकार मेरा वोट_अप वर्तमान में काम करता है।प्रति टिप्पणी प्रति उपयोगकर्ता एक वोट कैसे लागू करें?

मेरी टिप्पणी मॉडल में वर्णन और एक गिनती क्षेत्र है।

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

ध्यान दें कि SO – KevinDTimm

+0

पर 'एक वोट प्रति उपयोगकर्ता' की खोज करने से कई परिणाम मिलते हैं आपको वोट ट्रैक करने के लिए एक और मॉडल की आवश्यकता होगी। आप विशिष्टता बाधाओं का उपयोग केवल प्रति उपयोगकर्ता एक वोट की अनुमति देने के लिए कर सकते हैं, जो वास्तव में मिखाइलोव का जवाब करता है। –

+0

मैं उस उत्तर पर पढ़ रहा था लेकिन मैं इसे कैसे बनाऊंगा ताकि उपयोगकर्ता को बाद में अपना वोट बदलने की अनुमति हो? आइए -1 से 1 – Kevin

उत्तर

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 या किसी अन्य बुलाया इस्तेमाल कर सकते हैं।

+0

इसके लिए धन्यवाद मैंने इस विधि का उपयोग कुछ अन्य संशोधनों के साथ किया जो मुझे @ मिखाइलोव से मिला और मुझे अंततः काम करने के लिए मिला – Kevin

1

आप शायद लगता है कि गिनती संख्यानुसार के बराबर या कम से कम 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

हाँ मुझे लगा कि मुझे वोटों के लिए एक और मॉडल की आवश्यकता है, लेकिन मैं उपयोगकर्ता को बाद में अपना वोट बदलने की अनुमति देने के तरीके को कैसे कार्यान्वित करूं? – Kevin

+0

** अपडेट ** कार्रवाई उत्तर और उपयोगकर्ता आईडी-एस द्वारा वोट मिलेगी, फिर अपना वोट अपडेट करें – Anatoly

+0

आपको इसे थोड़ा सा उड़ाना होगा: अपने वोटों के लिए माइग्रेशन और मॉडल फ़ाइल रखें। विशेषताएं: [आईडी], user_id: पूर्णांक, comment_id: पूर्णांक, is_up: बूलियन; तो आपके पास दिए गए टिप्पणी के लिए अप/डाउन-वोट की संख्या वापस करने के लिए आपके वोट मॉडल में एक स्कोप (या क्लास फ़ंक्शन) हो सकता है। सबसे महत्वपूर्ण बात यह है कि आप ट्रैक कर सकते हैं कि किस उपयोगकर्ता ने किस टिप्पणी को वोट दिया - और उपयोगकर्ताओं को अपने वोट बदलने दें! – emrass

संबंधित मुद्दे