没有宝石的简单投票系统-如何跟踪上下投票,并允许每个user_id一票

时间:2020-04-28 01:40:19

标签: ruby-on-rails cancancan

任何帮助将不胜感激。我的旅程不到三周,因此提前致歉。

我编写了一个简单的列表投票系统,用户可以对列表进行上下投票。还行吧但是,我在两个问题上陷入困境:

  1. 限制user_id投票一次的最有效方法是什么?但是,他们随后可以上下投票。我开始过度设计after_touch回调。在用户模型中设置has_one:vote是最佳实践吗?之后,Active Record会处理一切吗?
  2. 当用户单击按钮时,是否可以禁用投票(向上或向下)按钮。是否无需添加其他数据库列来跟踪向上或向下投票?因此,他们可以在初始投票后在上下投票之间切换。

投票控制人

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

带有相关的上/下投票按钮的show.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] } %>

谢谢。

1 个答案:

答案 0 :(得分:0)

这令人困惑。您说要将User设置为has_one :vote。但是您的表似乎是user_idlist_id的联接表。因此,一个人可以对每个列表投一票,对吗?您可以强制唯一性,但不能强制您提到的方式。

您没有所有模型的模型代码,但可以使List模型具有

has_many :votes
has_many :users, through: :votes

然后用户拥有

has_many :votes
has_many :lists, through: votes

投票模型可以具有

belongs_to: :user
belongs_to: :list
validates :user_id, :uniqueness => { :scope => :list_id }

最后一次的唯一性验证将阻止我从此处理解的每个列表进行多个用户投票:http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#method-i-validates_uniqueness_of