Как заказать входящие элементы в Rails 3

У меня есть модельное соотношение, где today имеет много tasks

Я пытаюсь восстановить объект today пользователя, включить tasks и сделать все это Json. Все это продолжалось, пока я не решил заказать tasks в объекте today, потому что 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 для решения этой проблемы.

+35
источник поделиться
2 ответа

Попробуйте в модели Today:

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

EDIT: как упоминалось в комментарии ниже, в Rails 4+ это теперь:

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

(подробнее здесь)

+48
источник

Прямым решением было бы включить имя таблицы 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: 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

Но если вам нужно только/всегда заказывать по приоритету и не нуждаться в других разных порядках, проще добавить order в has_many :tasks.

+34
источник

Посмотрите другие вопросы по меткам или Задайте вопрос