How to order included elements in Rails 3

royvandewater picture royvandewater · Mar 18, 2011 · Viewed 23.2k times · Source

I have a model relationship where today has many tasks

I'm trying to retrieve a user's today object, include the tasks and render them all to Json. All of this was going great until I decided I wanted to order the tasks within the today object because respond_with block is also used for rendering the html page. Is there any way to include the tasks and order them?

I'm trying something like this:

class TodaysController < ApplicationController
  respond_to :html, :json
  def show
    @today = Today.where(:user_id => current_user.id).joins(:tasks).includes(:tasks).order(:priority).first
    respond_with @today, :include => :tasks
  end
end

This retrieves everything correctly, but does not seem to order the tasks at all.

This is what I used to have (which worked great, but didn't have the ordering):

class TodaysController < ApplicationController
  respond_to :html, :json
  def show
    @today = current_user.today
    respond_with @today, :include => :tasks
  end
end

I know I can retrieve the data and sort it afterwards like this:

@today = current_user.today
@today.tasks.sort!{|a,b| a.priority <=> b.priority }

This works and will pass my tests, but I was hoping for an ActiveRecord way to solve this.

Answer

khelll picture khelll · Mar 18, 2011

Try this in your Today model:

has_many :tasks, :order => 'priority DESC'

EDIT: As mentioned in comment below, in Rails 4+, this is now:

has_many :tasks, -> { order(:priority => :desc) }

(more info here)