I have users and problems associated with the voter model. Users can vote on questions. They can either vote up or down (as recorded in the voter model). Firstly, I want users to not be able to cast multiple votes in one direction. Secondly, I want to allow users to do the opposite vote. So, if they voted, they still have to vote, which will replace the vote. Users should never be able to vote on a problem twice. Here are my files:
class Issue < ActiveRecord::Base has_many :associations, :dependent => :destroy has_many :users, :through => :associations has_many :voterships, :dependent => :destroy has_many :users, :through => :voterships belongs_to :app STATUS = ['Open', 'Closed'] validates :subject, :presence => true, :length => { :maximum => 50 } validates :description, :presence => true, :length => { :maximum => 200 } validates :type, :presence => true validates :status, :presence => true def cast_vote_up!(user_id, direction) voterships.create!(:issue_id => self.id, :user_id => user_id, :direction => direction) end end class Votership < ActiveRecord::Base belongs_to :user belongs_to :issue end class VotershipsController < ApplicationController def create session[:return_to] = request.referrer @issue = Issue.find(params[:votership][:issue_id]) @issue.cast_vote_up!(current_user.id, "up") redirect_to session[:return_to] end end class User < ActiveRecord::Base authenticates_with_sorcery! attr_accessible :email, :password, :password_confirmation validates_confirmation_of :password validates_presence_of :password, :on => :create validates_presence_of :email validates_uniqueness_of :email has_many :associations, :dependent => :destroy has_many :issues, :through => :associations has_many :voterships, :dependent => :destroy has_many :issues, :through => :voterships end
Matthew berman
source share