Исправить механизм голосования - PullRequest
0 голосов
/ 18 марта 2011

Я внедрил систему голосования вверх / вниз, которая обновляется с помощью ajax в моем приложении Ruby on Rails.Кнопки вызывают метод создания, голосование вставляется в базу данных, и подсчитывается сумма голоса.

Однако на данный момент пользователь может повышать или понижать число голосов столько раз, сколько он или она хочет.Я хочу, чтобы голосование было таким же, как мы видим здесь, в StackOverflow, где пользователь может голосовать только один раз или только один раз, а голоса могут быть отменены.Как мне построить логику для этого?

Ответы [ 3 ]

1 голос
/ 18 марта 2011

Я бы порекомендовал гем acts_as_rateable , это то, что я использовал для такого рода требований для нескольких веб-сайтов. Делает работу отлично.

Если вы предпочли бы реализовать это самостоятельно, ваша Rating модель должна иметь user_id и быть полиморфной, чтобы присоединяться к любым моделям, которые вы хотели бы оценить. Затем вы можете просто написать свой контроллер AJAX, чтобы отклонить дубликаты голосов. На переднем крае Javascript, который удаляет функциональность ссылок из существующего upvote / downvote, должен быть реализован для хорошего UX.

0 голосов
/ 18 марта 2011
class Vote < ActiveRecord::Base
  belongs_to :question
  belongs_to :user

  validates_uniqueness_of :user_id, :scope=>question_id    
end

http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M000086

Ваш контроллер вернет ошибки, если вы попытаетесь проголосовать более одного раза.Попросите пользовательский интерфейс удалить голос, если вы проголосовали за, за которого проголосовали.

0 голосов
/ 18 марта 2011

Я думаю, у вас есть немного больше работы. Вы должны добавить в свою модель отношения «многие ко многим» между вопросами и пользователями, в которых вы помните, какой пользователь голосовал за какой вопрос и каким образом (вверх или вниз). После этого, когда вы выводите вопрос на экран, вы должны выбрать из этой таблицы голоса текущего пользователя, связанные с отображаемым вопросом.

Когда пользователь голосует за вопрос, вы должны добавить запись в соответствующую таблицу. Кроме того, при отображении вопроса, если пользователь проголосовал за (понижен), тогда вы должны стилизовать ссылку вверх (вниз) соответственно. И если пользователь снова попытается проголосовать, вы можете проверить его, прежде чем зарегистрировать голосование в базе данных, если пользователь уже проголосовал.

Может быть, это не самый быстрый способ сделать подобные вещи, но он дает вам максимальный контроль (позже вы можете отобразить подробную статистику о стиле голосования определенного пользователя, дате и времени, когда был отдан голос). , вы можете установить ограничение на количество голосов, которое пользователь может подавать в день и т. д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...