Использование sortable_element в Rails для списка, сгенерированного find () - PullRequest
0 голосов
/ 03 мая 2010

Я пытаюсь использовать вспомогательный метод scriptaculous sortable_element для реализации сортируемого с помощью перетаскивания списка в моем приложении Rails. Хотя код для представления выглядит довольно простым, я действительно не совсем уверен, что писать в контроллере для обновления столбца «position».

Вот что я вижу, "_show_related_pgs.erb":

<ul id = "interest_<%=@related_interest.id.to_s%>_siblings_list">
    <%= render :partial => "/interests/peer_group_map", :collection => @maps, :as => :related_pg %>
</ul>

<%= sortable_element("interest_"+@related_interest.id.to_s+"_siblings_list", :url => {:action => :resort_related_pgs}, :handle => "drag" ) %>
<br/>

А вот соответствующая строка из частичного: "интересов / peer_group_map.erb"

  <li class = "interest_<%=@related_interest.id.to_s%>_siblings_list"
         id = "interest_<%=related_pg.interest_id.to_s%>_siblings_list_<%=related_pg.id.to_s%>">

Магия Scriptaculous UI прекрасно работает с ними, но я не уверен, как изменить столбец «position» в БД, чтобы отразить это. Должен ли я передать коллекцию @maps обратно в контроллер и сказать ей, чтобы она проходила итерацию и увеличивала / уменьшала атрибут "position" в каждом? Если так, как я могу определить, какой предмет был перемещен вверх, а какой вниз? Я не смог найти что-то конкретное, используя Chrome dev-tools в сгенерированном html.

После каждого переупорядочения мне также нужно перерисовывать коллекцию @maps, поскольку позиция печатается рядом с именем каждого интереса (я использую его в качестве «дескриптора», указанного в моем вызове sortable_element ) выше) - хотя это должно быть тривиально.

Есть мысли?

Спасибо, -e

1 Ответ

0 голосов
/ 03 мая 2010

Обычно в контроллере создается действие сортировки, которое выглядит следующим образом:

def sort
  order = params[:my_ordered_set]
  MyModel.order(order)
  render :nothing => true
end

Не забудьте добавить маршрут:

map.resources :my_model, :collection => { :sort => :put }

Теперь в MyModel я добавляю метод класса, который обновляет все отсортированные записи одним запросом (думаю, это работает только в mysql ..):

def self.order(ids)
  update_all(
    ['ordinal = FIND_IN_SET(id, ?)', ids.join(',')],
    { :id => ids }
  )
end

Метод одного запроса взят из Хенрик Ных .

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