2010-09-13 1 views

ответ

13

Я рекомендую создать опцию like и dislike, используя классическую функциональность модели голоса.

Итак, у вас есть Vote в качестве таблицы соединений между User и Votable Item.

Значение голосования может работать как Vote.value + 1 = Like, Vote.value -1 = Не нравится, Vote.value = Нейтрально/не голосовало.

Ваш контроллер для votable элемента может выглядеть следующим образом:

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 

И для информации каждого, этот вопрос не заслуживает того, чтобы быть отвергнуто. Это вполне справедливо.

+0

Большое спасибо! Я попробую это ... :) – Madhusudhan

+0

Удачи Madhusudhan :) – Trip

-2

Почему бы не создать новое булево поле с именем like? а затем обновите его как false для не понравилось и true для как. Я сомневаюсь, что вы найдете плагин/драгоценный камень для этой функции.

+0

Где бы это булево поле перейти? – mark

+0

в базе данных или в курсе – Hugo

+1

Умм, да ... Я хочу сказать, что это не будет случай добавления булевского поля в существующую таблицу, как было предложено. Таблица соединений будет необходима с user_id, подобным атрибутом, возможно, с полиморфным атрибутом likeable_type и логическим полем. – mark

1

В этом вопросе я не вижу ничего плохого.

До сих пор рейтинг остается. Просто используйте только две звезды. :) Кажется, я помню act_as_rateable, позволяющий определять количество звезд.

5

Я знаю ответ уже был принят, но я только что нашел драгоценный камень под названием act_as_votable, которые могли бы соответствовать вашим потребностям:

выступает в качестве Votable является рубин Gem написаны специально для моделей Rails/ActiveRecord. Основными целями этого драгоценного камня являются:

  • Разрешить любую модель на голосование, как/нелюбовь, upvote/downvote и т.д.
  • Разрешить любую модель голосовать. Другими словами, голоса не должны поступать от пользователя, они могут поступать из любой модели (например, группы или группы).
  • Обеспечьте простой синтаксис записи/чтения.