2010-09-13 11 views

Odpowiedz

13

Polecam tworzenie opcji like i dislike, biorąc na siebie klasyczną funkcję modelu głosowania.

Masz Vote jako tabelę łączenia między User i Votable Item.

Wartość głosowania może działać jako Głosowanie. Wartość + 1 = Jak, Głosowanie.value -1 = Nie podoba mi się, Głosowanie.value = Neutralne/Nie głosowało.

Twój kontroler do votable elementu może wyglądać następująco:

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 

I za każdym informacji, kwestia ta nie zasługuje na przegłosowana. Jest całkowicie poprawny.

+0

bardzo dziękuję! Spróbuję tego ... :) – Madhusudhan

+0

Powodzenia Madhusudhan :) – Trip

-2

Dlaczego nie wystarczy utworzyć nowe pole o nazwie boolowskiej o nazwie like? a następnie zaktualizować jako false dla nie lubię i dla , takich jak. Wątpię, czy znajdziesz wtyczkę/klejnot dla tej funkcjonalności.

+0

Gdzie to logiczna pole iść? – mark

+0

w bazie danych lub kursie – Hugo

+1

Umm, tak ... Chodzi mi o to, że nie byłoby przypadkiem dodanie pola boolowskiego do istniejącej tabeli zgodnie z sugestią. Tabela złączna byłaby wymagana z user_id, likeable_id, opcjonalnie polimorficznego typu likeable_type i boolean. – mark

1

Nic nie widzę w tym pytaniu.

Głosowanie up to wciąż ocena. Wystarczy użyć tylko dwóch gwiazdek. :) Wydaje mi się, że remember_as_rateable pozwala na określenie liczby gwiazdek.

5

znam odpowiedź została już przyjęta, ale ja po prostu znaleźć klejnot zwany act_as_votable które mogłyby pasować do Twoich potrzeb:

działa jako Votable Gem Ruby jest specjalnie napisany dla modeli Rails/ActiveRecord. Główne cele tego klejnotu to:

  • Pozostawić dowolny model pod głosowanie, jak/niechęci, upvote/downvote itp
  • Pozostawić każdy model do głosowania. Innymi słowy, głosy nie muszą pochodzić od użytkownika, mogą pochodzić z dowolnego modelu (takiego jak grupa lub zespół).
  • Zapewnia łatwą do napisania/odczytu składnię.