Never been to DZone Snippets before?

Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

About this user

VK

« Newer Snippets
Older Snippets »
Showing 1-2 of 2 total  RSS 

Updating a join table by directly accessing the model

// project_controller.rb

   1  
   2  def update
   3      @project = Project.find(params[:id])
   4      if @project.update_attributes(params[:project])
   5        
   6        for user in user_checkboxes :selected
   7          @project.update_assignment(user, params[:user_role][user.id.to_s])
   8        end
   9         
  10        for user in user_checkboxes :unselected
  11          @project.delete_assignment(user)
  12        end
  13        
  14        flash[:notice] = 'Project was successfully updated.'
  15        redirect_to :action => 'show', :id => @project
  16         
  17      else
  18        render :action => 'edit'
  19      end
  20    end
  21  
  22  private
  23  
  24    def user_checkboxes(status)
  25      users = []
  26       for selected_user in params[:project_users].keys    
  27          choice = '1' if status == :selected
  28          choice = '0' if status == :unselected
  29          users << User.find(selected_user) if params[:project_users][selected_user] == choice
  30        end
  31      return users
  32    end 


// project.rb

   1  
   2  class Project < ActiveRecord::Base
   3    has_many :assignments, :dependent => :destroy
   4    has_many :users, :through => :assignments
   5    has_many :roles, :through => :assignments
   6  
   7    def update_assignment(user, role_id)
   8      unless self.users.include?(user)
   9        Assignment.create(:project_id => self.id,
  10                          :user_id => user.id,
  11                          :role_id => role_id)
  12      else
  13        # update existing users
  14        assignment = Assignment.find_by_user_id_and_project_id(user.id, self.id)
  15        assignment.role_id = role_id
  16        assignment.save
  17      end
  18    end
  19  
  20    def delete_assignment(user)
  21      Assignment.destroy_all("user_id = #{user.id} AND project_id = #{self.id}")
  22    end
  23  
  24  end

Validations with a join table

   1  
   2  # I added this to the User Class:
   3  
   4  attr_accessor :selected_roles
   5  
   6    def selected_roles
   7      @selected_roles
   8    end
   9  
  10    def validate
  11      errors.add_to_base("You must specify a role") if self.selected_roles.empty?
  12    end
  13  
  14  # The create/update methods start like this:
  15  
  16   def create
  17      @user = User.new(params[:user])
  18      @user.selected_roles = get_selected_roles   
  19      if @user.save
  20        update_roles_users(@user.id)
  21        flash[:notice] = 'User was successfully created.'
  22        redirect_to :action => 'list'
  23  
  24  # And a method for checking the HTML form:
  25  
  26  def get_selected_roles
  27      selected_roles = Array.new
  28       for selected_role in params[:roles_user].keys
  29          # checkbox sends 1 if selected
  30          selected_roles << Role.find(selected_role) if params[:roles_user][selected_role] == "1" 
  31        end
  32        return selected_roles
  33    end
« Newer Snippets
Older Snippets »
Showing 1-2 of 2 total  RSS