47

我有一个模型关系,其中today有很多tasks

我正在尝试检索用户的today对象,包括tasks并将它们全部呈现给 Json。所有这一切都很顺利,直到我决定要taskstoday对象内订购,因为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

这会正确检索所有内容,但似乎根本没有对任务进行排序。

这是我曾经拥有的(效果很好,但没有订购):

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

我知道我可以检索数据并在之后对其进行排序,如下所示:

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

这可行并且会通过我的测试,但我希望有一种 ActiveRecord 方法来解决这个问题。

4

2 回答 2

69

Today在你的模型中试试这个:

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

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

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

更多信息在这里

于 2011-03-18T08:35:08.247 回答
52

直接的解决方案是在tasks之前包含表名priority

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: todaysUser模型以放弃该where子句并执行以下操作:

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

但是如果你只需要/总是按优先级排序,而不需要其他不同的排序,添加orderhas_many :tasks更容易。

于 2013-05-28T16:09:15.217 回答