Сортировка элементов в методе Rails Controller
У меня проблема с записью действия контроллера, которое принимает идентификаторы Post, переданные в качестве параметра, и сортирует их в определенном порядке перед их публикацией.
Сообщения имеют position
атрибут (я использую Act_as_list для сортировки), и либо опубликованы или неопубликованы (для поиска с named_scopes Post.published
а также Post.unpublished
соответственно).
По сути, существует интерфейс JavaScript, который позволяет пользователям перетаскивать неопубликованные сообщения в очередь и публиковать их, передавая идентификаторы как post_ids
параметр метода контроллера, который выглядит следующим образом:
def publish
Post.update_all(['published=?', true], :id => params[:post_ids])
redirect_to admin_path
end
Публикация таких сообщений работает нормально. Далее мне нужно отсортировать посты по их позиции в определенном порядке, и именно здесь у меня возникают проблемы.
Допустим, пользователь перетаскивает сообщение 5, затем сообщение 3, затем сообщение 7 в очередь и нажимает кнопку "Опубликовать".
То, что я хочу сделать, - это затем организовать все Сообщения так, чтобы они имели 5, 3, 7 в первых позициях по порядку, а затем остальные объекты Post в том порядке, в котором они уже были, так что сортировка по Post.position будет [5, 3, 7, ...the rest of the posts in order here...]
Затем, если пользователь перетащит две новые записи в очередь и нажмет "Опубликовать" (на этот раз, скажем, сообщения 2 и 4), сообщения должны быть в порядке [2, 4, 5, 3, 7, ...the rest of the posts in order here...]
Затем для окончательного примера, скажем, пользователь перемещает посты 10, 1 и 12 в очередь и публикует, порядок должен быть [10, 1, 12, 2, 4, 5, 3, 7, ...the rest of the posts in order here...]
так далее...
Я бы показал код, над которым я работал, но я не уверен, что он будет полезен, так как я не смог правильно его отсортировать. Но, по сути, я представляю, что это проблема взятия двух массивов, первый из которых - все сообщения, а второй - публикация сообщений, и помещение каждого элемента в массив сообщений для публикации в начале массива всех сообщений, а затем публикация. Я просто не могу заставить его работать. Любая помощь здесь будет принята с благодарностью, и я заранее благодарю вас за ваше время!
Редактировать В случае, если это поможет, вот код, который я написал до сих пор. При тестировании кажется, что этот метод сортирует сообщения из очереди правильно с первого раза, но все последующие опубликованные сообщения не перемещаются в начало списка опубликованных сообщений.
def publish
if params[:to_publish].present?
# :to_publish are the posts dragged into the queue in order.
# Here I'm cleaning up the Javascript input and then iterating
# through them to update their sort order.
params[:to_publish].to_s.split(",").uniq!.each_with_index do |id, index|
Post.update_all(['position=?', index + 1], ['id=?', id])
end
end
# :post_ids are the posts to be published, order is irrelevant.
# For client-side reasons they're passed as a separate parameter.
Post.update_all(['published=?', true], :id => params[:post_ids])
redirect_to admin_path
end
1 ответ
Титулы [:to_publish].to_s.split("") уник.!
Вот почему вы делаете уникальную проверку? Это защитная мера?
Также обратите внимание, что Uniq! возвращает nil, если дубликатов не найдено, что приводит к тому, что ваш код выдает нулевую ссылку, если массив не содержит дубликатов.
Если в вашем коде есть блок восстановления, который глотает эту нулевую ссылку, вы попали в беду!