откуда рельсы получают запросы для вложенных объектов? - PullRequest
1 голос
/ 18 февраля 2011

У меня есть хорошая 3-уровневая вложенная форма, использующая formtastic_cocoon (jquery), и теперь я хочу иметь возможность сортировать 2-й набор элементов в форме.

У меня jQuery ui работает без проблем, поэтому теперь, чтобы установить и обновить порядок сортировки в рельсах.

Я начал следить за рельсами битов сортируемых списков Railscasts http://asciicasts.com/episodes/147-sortable-lists

Структура формы: Пользователь-> Задачи-> Местоположение.

В моей модели задач я установил индекс на

 def index
    @task = Task.find(params[:id],:order=>'position')
 end

def edit 
    @task = Task.find(params[:id],:order=>'position')
end 

и ожидал, что моя консоль увидит

... FROM 'tasks' WHERE ('users'.'id' = 12) ORDER BY ('position')

или что-то в том же духе, но порядок вывода не определен.

Есть ли где-то еще, что мне нужно определить этот порядок ??Откуда nested_object получает свои отношения?Только модель?

Мои модели

class User < ActiveRecord::Base

     has_many :tasks
end 

class Task < ActiveRecord::Base

    belongs_to :user
end

Ответы [ 4 ]

1 голос
/ 18 февраля 2011

Ваш код здесь немного неправильный.

Чтобы найти задачи этого пользователя, вы должны сделать это на своем маршруте:

User.find(params[:id]).tasks(:order=>'position')
1 голос
/ 18 февраля 2011

Вы используете неправильную модель, это идентификатор пользователя, поэтому вы должны сделать:

User.find(params[:id]).tasks(:order => 'position ASC')

В противном случае вы просто получаете задачу с id = 12, а не задачи, чьи user_id = 12

1 голос
/ 18 февраля 2011

Из ответа, который вы дали, я подозреваю, что реальная проблема не в контроллере задач. Порядок, который вы указали по умолчанию, великолепен, но если у вас есть другие требования к порядку или фильтру, модель задач тоже не справится с этим.

Я подозреваю, что вы на самом деле были пользователями # edit или, возможно, _form.html.erb, где он отображает элементы формы для каждой задачи. Возможно, это был @ user.tasks.each {...} или похожий блок цикла.

Для данного пользователя выполните: @ user.tasks.order (: position). Или, может быть, вам нужны открытые задачи: @ user.tasks.where (: open => true) и т. Д.

1 голос
/ 18 февраля 2011

Я изменил модель на

class User < ActiveRecord::Base
     has_many :tasks, :order=>'position'
end
...