Technical
Sort Helper

Helper


  def determine_sort_image(to_sort_by,currently_sorted_by,order)
  if to_sort_by  currently_sorted_by
    if order  ‘ASC’
      image_tag(“arrow2_ascend.gif”,:border => “0”,:id => “img_tag”)
    elsif order == ‘DESC’
     image_tag(“arrow2_descend.gif”,:border => “0”,:id => “img_tag”)
    end
  else
      image_tag(“arrow2_clear.gif”,:border => “0”,:id => “img_tag”)
  end
  end
# TEST TEST TEST
  def test_image_flipper
    asc_image = determine_sort_image(“market_date”,”market_date”,”ASC”)
    assert(asc_image = /arrow2_ascend/)
    desc_image = determine_sort_image(“market_date”,”market_date”,”DESC”)
    assert(desc_image = /arrow2_descend/)
    clear_image = determine_sort_image(“market_date”,”ric”,”ASC”)
    assert(clear_image =~ /arrow2_clear/)
  end

View


  <th class="header_column_0">Legal Entity Id <%= link_to(determine_sort_image('legalEentityId',
                                                                                     session[:order_by_column],
                                                                                     session[:order_direction]),
                                                                :action => "show_links_sorted",:sort_by => "legalEentityId") %>   </th>

        <th class="header_column_1">Legal Entity Name<%= link_to(determine_sort_image('nameFull',
                                                                                      session[:order_by_column],
                                                                                      session[:order_direction]),
                                                                 :action => "show_links_sorted",:sort_by => "nameFull") %>  </th>

Model

I have two tables Parent and Legal Entity where parent has_many: legal entities

so in the Parent model i create following function nothing fancy


def legal_entity_links_sorted(field,direction)
  return LegalEntity.find(:all,
                          :conditions => "parentId = #{self.parentId}",
                          :order => "#{field} #{direction}",
                          :select => "legalEntityId , nameFull")
end
#Test obviously:
assert_nothing_raised{Parent.find(25).legal_entity_links_sorted("legalEntityId","ASC")}
assert_equal 531,Parent.find(25).legal_entity_links_sorted("legalEntityId","ASC")[0].legalEntityId
assert_equal 5291,Parent.find(25).legal_entity_links_sorted("legalEntityId","DESC")[0].legalEntityId
assert_equal "Aristeia Partners, L.P.",Parent.find(25).legal_entity_links_sorted("legalEntityId","DESC")[0].nameFull

Controller


# TEST FIRST

 def test_show_ordered
     get :show_ordered,:id => "UK",:sort_by => "sector" 
     assert_equal "UK",assigns(:selected_main_tab)
     assert_equal "sector",@request.session[:order_by_column]
     assert_equal "ASC",@request.session[:order_direction]

     get :show_ordered,:id => "UK",:sort_by => "sector" 
     assert_equal "DESC",@request.session[:order_direction]
     get :show_ordered,:id => "UK",:sort_by => "markter" 
     assert_equal "ASC",@request.session[:order_direction]
 end

# CODE

 def show_ordered
    set_sort_related_sessions
    @selected_main_tab = params[:id]
    render :action => "show" 
  end

  private
  def set_sort_related_sessions
     if session[:order_by_column]==params[:sort_by]
      if session[:order_direction]=='DESC'
        session[:order_direction] \= 'ASC'
      else
        session[:order_direction] \= 'DESC'
      end
    elsif !params[:sort_by].nil?
      session[:order_by_column] \= params[:sort_by]
      session[:order_direction] \= 'ASC'
    else
      session[:order_by_column] \= "lower(nameFull)" # set default sort column
      session[:order_direction] \= "ASC" 
    end

  end

Sort Images ( can be improved as anything )

arrow_clear.gif arrow_down.gif arrow_asc.gif