Order array. undefined method `order' for Array. Convert array into hash?

11,486

order is a method used for sorting at the database level. since @hotels is an array, you won't be able to sort using order. Try the following (not tested and you may want to include array pagination if you haven't included it yet)

@hotels = @hotels.sort_by(&:"#{sort_column}")
@hotels = @hotels.reverse if sort_direction == 'DESC'
@hotels = @hotels.paginate(:page => params[:page], :per_page => 5)
Share:
11,486
Ilya Cherevkov
Author by

Ilya Cherevkov

I like engineering simple stuff that just works.

Updated on June 24, 2022

Comments

  • Ilya Cherevkov
    Ilya Cherevkov almost 2 years

    I have a City model and in city's show action I want to render hotels nearby specific locations in the city. Cities has_many locations; hotels are being searched using Geocoder near method.

    To add order functionality I've followed Ryan Bates screencasts #228, but this approach doesn't seem to work with arrays, giving error undefined method `order' for #< Array:0x007f960d003430>

    cities_controller.rb
    
    helper_method :sort_column, :sort_direction
    def show
      session[:search_radius] = 2 if session[:search_radius].blank?
      @city = City.find(params[:id])
      @locations = @city.locations
      @hotels = []
      @locations.each do |location|
        unless location.longitude.blank? || location.latitude.blank? 
          center_point = [location.latitude, location.longitude]
          box = Geocoder::Calculations.bounding_box(center_point, session[:search_radius])
          thotels = Hotel.near(center_point, session[:search_radius]).within_bounding_box(box)
        else
          thotels = Hotel.near(center_point, session[:search_radius])
        end
        @hotels += thotels if thotels
        @hotels = @hotels.uniq
      end
      @hotels = @hotels.order(sort_column + " " + sort_direction).paginate(:page => params[:page], :per_page => 5)
      @json = @locations.to_gmaps4rails
    
      respond_with @json, :location => city_url
    end
    
    
    private
    
      def sort_column
        Hotel.column_names.include?(params[:sort]) ? params[:sort] : "name"
      end
    
      def sort_direction
        %w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
      end
    

    My question is: should I concentrate in converting an array into hash or should I initially create hash of hotels, or maybe find completely different approach to perform sorting?