没有gem的简单投票系统-如何跟踪向上或向下的投票,并允许每个user_id进行一次投票



如有任何帮助,我们将不胜感激。我的铁路之旅还不到三周,因此提前道歉。

我写了一个简单的列表投票系统,用户可以向上或向下投票表示列表。它还可以。然而,我陷入了两个问题:

  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] } %>

提前谢谢。

这很令人困惑。您说要将User设置为has_one :vote。但是您的表似乎是user_idlist_id的联接表。所以一个人每个名单可以投一票,对吗?你可以强制执行唯一性,但不能像你提到的那样。

你没有所有模型的模型代码,但你可以让列表模型具有

has_many :votes
has_many :users, through: :votes

然后用户有

has_many :votes
has_many :lists, through: votes

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_o

相关内容

最新更新