Help with sorting results

Greetings,

I'm programming a section of my application that will store and list
stories. These stories should be sorted by three factors: genre,
order_by (such as time posted), and sort (ascending or descending). I
want to give my users the ability to easily sort through the list of
stories.

To achieve this, I've setup a named route:

map.sort_by 'stories/sort_by/:genre/:order_by/:sort', :controller =>
"stories", :action => "index" (Both :order_by and :sort may be left
nil)

I'm stuck at the point of actually sorting and returning the results
(the controller logic). I've done some research, though am still quite
a newbie on rails. >< In your opinion, what would be the best way to
sort the stories based off of what is, and is not supplied to the
controller? For example, if only params(:genre) is supplied, I want
the list of stories to only display the specified genre. However, if
params(:order_by) is also supplied, the list would be of one genre and
listed, ASC or DESC by whatever :order_by is targeting.

Thanks in advance for you help!

~Dustin Tigner

I'm programming a section of my application that will store and list
stories. These stories should be sorted by three factors: genre,
order_by (such as time posted), and sort (ascending or descending). I
want to give my users the ability to easily sort through the list of
stories.

To achieve this, I've setup a named route:

map.sort_by 'stories/sort_by/:genre/:order_by/:sort', :controller =>
"stories", :action => "index" (Both :order_by and :sort may be left
nil)

I'm stuck at the point of actually sorting and returning the results
(the controller logic). I've done some research, though am still quite
a newbie on rails. >< In your opinion, what would be the best way to
sort the stories based off of what is, and is not supplied to the
controller? For example, if only params(:genre) is supplied, I want
the list of stories to only display the specified genre. However, if
params(:order_by) is also supplied, the list would be of one genre and
listed, ASC or DESC by whatever :order_by is targeting.

I'd do something like this:

if params[:genre]
   conditions = ['genre = ?', params[:genre]
else
   conditions = nil
end

params[:sort] = 'asc' unless ['asc', 'desc'].include?(params[:sort].downcase)

params[:order] = 'title' unless ['title', 'created_at', 'some_field'].include?(params[:order_by].downcase)

Story.find(:all, :conditions => conditions, :order => "#{params[:order]} #{params[:sort]}")

This way you check all the inputs and force them into something reasonable if they aren't what you want.

Thanks Philip!

That really helped. The application is running smoothly and everything
is working. :slight_smile:

~Dustin Tigner