如何在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
就更容易了。