can I keep the records order using a scope : where(:id => geo_ids)

I am using this scope , in which geo_ids is a sorted array of Ids ...

scope :geo_filtered_with, lambda { |geo_ids|     where(:id => geo_ids)   }

is the resulting output always sorted according to this order ? or should I modify it ?

thanks for your feedback

I am using this scope , in which geo_ids is a sorted array of Ids ...

scope :geo_filtered_with, lambda { |geo_ids|     where(:id => geo_ids)   }

is the resulting output always sorted according to this order ? or should I modify it ?

Since you have not specified any sort specification the order is not defined. If you want a particular order you must specify it.

Colin

Thanks Colin for your answer

let me draw the big picture : in my iatme controller ,before the display ( scope and pagination) , I searched for geolocalized data of item ( with distance from the search), and I get a sorted array of Item Ids, (already sorted on the distance : item_ids = [ 5, 2, 1, 10, ...] )

then I display the items using Kaminari pagination ( Kaminary doesn't paginate an array )

@items = Item.geo_filtered_with(geo_ids).page params[:page]

and my model scope is :

  scope :geo_filtered_with, lambda { |item_ids|     where(:id => item_ids)   }

so I wonder if the result of the scope will keep the same order as the item_ids which means : items.id IN [ 5, 2, 1, 10, ...] will always get items records 5, 2, 1, 10 .... in this order

that's why I did not specified a sort order with the scope, is it clear ?

It will not be sorted. You just pass an array basically to that named scope. And you will get results that satisfy the array so to speak, but it can come in any order. Just add .order(‘id DESC’) (or ASC) clause explicitly.

As far as your clarification goes, well it depends on whether or not you can sort with SQL. If you cannot, then you are left with sorting results with your custom Ruby code.

BTW Kaminari can paginate an arbitrary array, so you might work with that (by defining a sorting method or something more/less complicated).

thanks , I uses I was not clear enough... if I do: where(:id => item_ids).order('id DESC') then the output will not be what I want in this case, items.id IN [ 5, 2, 1, 10, ...] will give => [1, 2, 5, 10, ..]

this is exactly what I don't want .. I want to keep: where(:id => item_ids) with order the same as the array

OK, and thanks a lot using Kaminari.paginate_array(@geo_items) solved my issue ... I can get an array of items in which I can insert the distance from the search point and sort the array on this distance.. I could not save this info into the item instance as it depends upon each user's search ...

thanks a lot again !!

Sure, glad it helped, it’s not a trivial problem you’ve just taken care of! :slight_smile:

I mean that’s the process basically (until you deploy to prod at least): fix thing A, then fix things B and C that depended on previous A’s implementation and so on. Try to get into RSpec so that a solved problem stays that way.