2010-09-13 14 views

Respuesta

13

Recomiendo crear la opción like y dislike adoptando la funcionalidad clásica de modelo de voto.

Así que tiene Vote como una tabla de unión entre User y Votable Item.

Un valor de voto puede funcionar como Vote.value + 1 = Me gusta, Vote.value -1 = No me gusta, Vote.value = Neutral/No vota.

Su controlador para su artículo VOTable puede tener este aspecto:

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 

Y para información de todos, esta pregunta no merecía ser votado hacia abajo. Es completamente válido.

+0

muchas gracias Trip! Voy a probar esto ... :) – Madhusudhan

+0

Buena suerte Madhusudhan :) – Trip

-2

¿Por qué no crear un nuevo campo booleano llamado like? y luego actualizarlo como false para dislike y true para como. Dudo que encuentres un plugin/gema para esta funcionalidad.

+0

¿Dónde este campo booleano ir? – mark

+0

en la base de datos o curso – Hugo

+1

Umm, sí ... Mi punto es que no sería un caso de agregar un campo booleano a una tabla existente como se sugiere. Se requerirá una tabla de unión con user_id, likeable_id, opcionalmente polymorphic likeable_type y boolean. – mark

1

No veo nada de malo con la pregunta.

La votación hacia arriba sigue siendo la calificación. Solo usando solo dos estrellas. :) Me parece recordar acts_as_rateable que permite el número de definición de estrella.

5

sé una respuesta ya ha sido aceptado, pero me acaba de encontrar una joya llamada act_as_votable que podrían ajustarse a sus necesidades:

actúa como VOTable es una joya de Ruby escrita específicamente para los modelos de rieles/ActiveRecord. Los principales objetivos de esta joya son:

  • permitir que cualquier modelo que se va a votar, como/aversión, upvote/downvote, etc.
  • Permitir que cualquier modelo de voto. En otras palabras, los votos no tienen que provenir de un usuario, pueden provenir de cualquier modelo (como un grupo o equipo).
  • Proporcionan una sintaxis fácil de escribir/leer.
Cuestiones relacionadas