У меня проблема с записью действия контроллера, которое принимает идентификаторы Post, переданные в качестве параметра, и сортирует их в определенном порядке перед публикацией.
Сообщения имеют атрибут position
(я использую для сортировки act_as_list) и публикуются или не публикуются (доступны для поиска с именованными_скопами 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