Ea0b4e0dce47a1d4bba05b1bdffdc2d7

This is my first post please be sensitive about the quality of my code . .

def setup_search
    @timetable = Timetable.find( :first,
      :conditions => [ 'day = ? AND status = "active"', params[:id] ]
    )

    if @timetable
      if params[:age_group] == 'adult'
        if params[:timetable_type] == 'term'
          @activities = @timetable.activities.find( :all,
            :conditions => [
              "category = ? AND timetable_type = ?",
              'Adult Members',
              'term' ],
            :order => 'start_time'
          )
        elsif params[:timetable_type] == 'holiday'
          @activities = @timetable.activities.find( :all,
            :conditions => [
              "category = ? AND timetable_type = ?",
              'Adult Members',
              'holiday' ],
            :order => 'start_time'
          )
        else
          @activities = @timetable.activities.find( :all,
            :conditions => [ "category = ?",
              'Adult Members' ],
            :order => 'start_time'
          )
        end
      elsif params[:age_group] == 'junior'
        if params[:timetable_type] == 'term'
          @activities = @timetable.activities.find( :all,
            :conditions => [ "category = ? AND timetable_type = ?",
              'Young Members',
              'term' ],
            :order => 'start_time'
          )
        elsif params[:timetable_type] == 'holiday'
          @activities = @timetable.activities.find( :all,
            :conditions => [ "category = ? AND timetable_type = ?",
              'Young Members',
              'holiday' ],
            :order => 'start_time'
          )
        else
          @activities = @timetable.activities.find( :all,
            :conditions => [ "category = ?",
              'Young Members' ],
            :order => 'start_time'
          )
        end
      else
        if params[:timetable_type] == 'term'
          @activities = @timetable.activities.find( :all,
            :conditions => [ "timetable_type = ?",
              'term' ],
            :order => 'start_time'
          )
        elsif params[:timetable_type] == 'holiday'
          @activities = @timetable.activities.find( :all,
            :conditions => [ "timetable_type = ?",
              'holiday' ],
            :order => 'start_time'
          )
        else
          @activities = @timetable.activities.find( :all,
            :order => 'start_time'
          )
        end
      end
    end
  end

Refactorings

No refactoring yet !

880cbab435f00197613c9cc2065b4f5a

danielharan

October 22, 2008, October 22, 2008 02:43, permalink

No rating. Login to rate!

Here's what I'd be aiming for, taking advantage of named_scope and trying to to push query logic to the model.

def setup_search
    @timetable = Timetable.find( :first,
      :conditions => [ 'day = ? AND status = "active"', params[:id] ]
    )
    
    return unless @timetable
    
    @timetable.activities.for_age_group( params[:age_group] ).for_timetable_type( params[:timetable_type] )
end

class Activity  < ActiveRecord::Base

  AGE_GROUPS = {'adult' => 'Adult Members', 'junior' => 'Young Members'}
  named_scope :for_age_group, lambda { |age| { :conditions => { :category => AGE_GROUPS[age] } } if AGE_GROUPS.keys.include?(age) }
  
  named_scope :for_timetable_type, lambda { |type| { :conditions => { :timetable_type => type } } if %w{term holiday}.include?type }
end
A8d3f35baafdaea851914b17dae9e1fc

Adam

October 22, 2008, October 22, 2008 05:34, permalink

No rating. Login to rate!

Expanding on what danielharan wrote:

class Timetable < ActiveRecord::Base
  named_scope :active, :conditions => { :status => 'active' }
end

class ActivitiesController < ApplicationController
  before_filter :setup_timetable
  before_filter :setup_activities, :if => :timetable?
  
  private
    def timetable?
      @timetable
    end
  
    def setup_timetable
      @timetable = Timetable.active.find_by_day(params[:timetable_id])
    end
    
    def setup_activities
      @activities = @timetable.activities.
        for_age_group(params[:age_group]).
        for_timetable_type(params[:timetable_type]).
        find(:all, :order => 'start_time')
    end
end

Your refactoring





Format Copy from initial code

or Cancel