2010-09-13 10 views

risposta

13

Si consiglia di creare l'opzione like e dislike adottando la funzionalità classica del modello di voto.

Quindi si dispone di Vote come tabella di unione tra User e Votable Item.

Un valore di voto può funzionare come Vote.value + 1 = Like, Vote.value -1 = Dislike, Vote.value = Neutral/Non ha votato.

Il controller per il tuo articolo votable può assomigliare a questo:

def like 
    get_vote 
    @vote.value += 1 unless @vote.value == 1 
    @vote.save 
    respond_to do |format| 
    format.html 
    format.js 
    end 
end 

def dislike 
    get_vote 
    @vote.value -= 1 unless @vote.value == -1 
    @vote.save 
    respond_to do |format| 
    format.html 
    format.js 
    end 
end 

private 

def get_vote 
    current_item = @item.detect{|r| r.id == params[:id].to_i} 
    @vote = current_item.votes.find_by_user_id(current_user.id) 
    unless @vote 
    @vote = Vote.create(:user_id => current_user.id, :value => 0) 
    current_item.votes << @vote 
    end 
end 

E per info di tutti, questa domanda non meritava di essere bocciato. È completamente valido.

+0

grazie mille Viaggio! Ci proverò ... :) – Madhusudhan

+0

Buona fortuna Madhusudhan :) – Trip

-2

Perché non creare un nuovo campo booleano denominato like? e quindi aggiornarlo come false per per antipatia e true per come. Dubito che tu trovi un plugin/gemma per questa funzionalità.

+0

Dove sarebbe questo campo booleano andare? – mark

+0

nel database o nel corso – Hugo

+1

Umm, sì ... Il mio punto è che non si tratta di aggiungere un campo booleano a una tabella esistente come suggerito. Sarebbe necessaria una tabella di join con user_id, likeable_id, facoltativamente polimorfo likeable_type e campo booleano. – mark

1

Non vedo nulla di sbagliato nella domanda.

Il voto negativo continua a essere valutato. Solo usando solo due stelle. :) Mi sembra di ricordare che act_as_rateable consente il numero di definizione di una stella.

5

so una risposta è già stata accettata, ma ho appena trovato una gemma chiamata act_as_votable che potrebbero soddisfare le vostre esigenze:

agisce come Votable è un rubino gemma scritto appositamente per i modelli Rails/ActiveRecord. Gli obiettivi principali di questo gioiello sono:

  • Consenti qualsiasi modello che sarà votata, come/antipatia, upvote/downvote, ecc
  • Lasciare che qualsiasi modello di voto. In altre parole, i voti non devono venire da un utente, possono provenire da qualsiasi modello (come un gruppo o una squadra).
  • Fornisce una sintassi di facile lettura/scrittura.
Problemi correlati