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 !
danielharan
October 22, 2008, October 22, 2008 02:43, permalink
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
Adam
October 22, 2008, October 22, 2008 05:34, permalink
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
This is my first post please be sensitive about the quality of my code . .