Сортировка элементов в методе Rails Controller - PullRequest
0 голосов
/ 29 августа 2010

У меня проблема с записью действия контроллера, которое принимает идентификаторы 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

1 Ответ

0 голосов
/ 29 августа 2010

Титулы [: to_publish].! .To_s.split ( "") Uniq

Вот, почему вы делаете уникальную проверку? Это защитная мера?

Также обратите внимание, что uniq! возвращает nil, если дубликатов не найдено, что приводит к тому, что ваш код выдает нулевую ссылку, если массив не содержит дубликатов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...