Любая помощь будет наиболее ценной. Я меньше трех недель в своем путешествии, поэтому заранее извиняюсь.
Я написал простую систему голосования по спискам, пользователь может голосовать за или против указанного списка. Это работает хорошо. Тем не менее, я застрял в двух вопросах:
- Какой самый эффективный способ ограничения user_id голосовать один раз? Тем не менее, они могут переключить свой голос вверх или вниз. Я начал сверхинжиниринг
after_touch
Callback. Является ли лучшая практика для установки has_one: голоса в модели пользователя? После этого Active Record позаботится обо всем? - Можно ли отключить кнопку голосования (вверх или вниз), когда пользователь нажимает кнопку. Без добавления еще одного столбца базы данных для отслеживания голосов "за" или "против" Таким образом, они могут переключаться между голосованием вверх или вниз после первоначального голосования.
Контролер голосов
class VotesController < ApplicationController
def vote_up
@list = List.find(params[:list_id])
@vote = Vote.find_or_create_by(list_id: params[:id], user_id: current_user.id)
Vote.increment_counter(:vote_count, @vote)
redirect_to list_path(@list), notice: 'Voted Up.'
end
def vote_down
@list = List.find(params[:list_id])
@vote = Vote.find_or_create_by(list_id: params[:id], user_id: current_user.id)
Vote.decrement_counter(:vote_count, @vote)
redirect_to list_path(@list), notice: 'Voted Down.'
end
end
схема
create_table "votes", force: :cascade do |t|
t.integer "vote_count"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.bigint "list_id", null: false
t.integer "user_id"
t.index ["list_id"], name: "index_votes_on_list_id"
end
отрывок из шоу. html .erb с соответствующими кнопками голосования вверх / вниз
<% if @list.votes.any? %>
Count Of Votes <%= content_tag(:p, list_vote_counter?) %>
<% end %>
<%= button_to 'Vote Up', list_vote_up_path, method: :post, params: { list_id: params[:id] } %>
<%= button_to 'Vote Down', list_vote_down_path, method: :post, params: { list_id: params[:id] } %>
Заранее спасибо.