class ScheduledLoadsPresenter < LoadsPresenter def loads Load.scheduled.eager.map{ |l| LoadPresenter.new(l) }.sort{|x, y| sort_with_custom_rules(comparators, x, y) } end def comparators [sort_by_val_proc(:deliver_on), Proc.new{|x,y| load_type_order = %w(Hauling Wholesale Home Vacation) x_index = load_type_order.index(x.load_type_name) y_index = load_type_order.index(y.load_type_name) x_index <=> y_index }, sort_by_val_proc(:customer_name), sort_by_val_proc(:destination_name), sort_by_val_proc(:supplier_name)] end private def sort_by_val_proc(field_name) Proc.new{|x,y|x.send(field_name) <=> y.send(field_name)} end def sort_with_custom_rules(comparators, x, y) comparators.each{|c| result = c.call(x, y); return result unless result.zero? } end end