如何在Rails 3中订购包含的元素

我有一个模型关系, today有许多tasks

我试图检索用户的today对象,包括tasks并把它们都呈现给Json。 所有这一切都很好,直到我决定我想要在today对象内tasks ,因为respond_with block也用于渲染html页面。 有什么办法可以包括这些tasks并订购?

我正在尝试这样的事情:

 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 

这检索正确的一切,但似乎并没有sorting的任务。

这是我曾经有过的(工作很好,但没有sorting):

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

我知道我可以检索数据,并按照如下方式进行sorting:

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

这工作,并会通过我的testing,但我希望有一个ActiveRecord的方式来解决这个问题。

在你Today模型中试试这个:

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

编辑:正如在下面的评论中提到的,在Rails 4+,现在是:

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

( 更多信息在这里 )

直接解决scheme是在priority之前包含tasks表名称:

 Today.where(:user_id => current_user.id).includes(:tasks).order('tasks.priority').first # joins(:tasks) is not required 

或者,如果您不想让表名称硬编码,则可以从Task模型合并范围:

 Today.where(:user_id => current_user.id).joins(:tasks).includes(:tasks).merge(Task.order(:priority)).first # joins(:tasks) here is required 

此外,你可以添加has_many: todays User模型沟渠的where子句,并做:

 current_user.todays.includes(:tasks).order('tasks.priority').first # or current_user.todays.joins(:tasks).includes(:tasks).merge(Task.order(:priority)).first 

但是,如果您只需要/总是按优先顺序sorting,并且不需要其他不同的sorting,那么向has_many :tasks添加order就更容易了。