Ответ 1
Попробуйте в модели Today
:
has_many :tasks, :order => 'priority DESC'
EDIT: как упоминалось в комментарии ниже, в Rails 4+ это теперь:
has_many :tasks, -> { order(:priority => :desc) }
У меня есть модельное соотношение, где 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 для решения этой проблемы.
Попробуйте в модели Today
:
has_many :tasks, :order => 'priority DESC'
EDIT: как упоминалось в комментарии ниже, в Rails 4+ это теперь:
has_many :tasks, -> { order(:priority => :desc) }
Прямым решением было бы включить имя таблицы 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
.