Сортировка элементов в методе 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, если дубликатов не найдено, что приводит к тому, что ваш код выдает нулевую ссылку, если массив не содержит дубликатов.

Если в вашем коде есть блок восстановления, который глотает эту нулевую ссылку, вы попали в беду!

Другие вопросы по тегам