Как создать сортируемый интерфейс с «действует как вложенный набор» в RubyOnRails

Я реализовал несколько хороших интерактивных интерфейсов, которые могут сортировать списки в моем приложении m rails для моделей, использующих acts_as_list. У меня есть функция сортировки, которая вызывается и устанавливает позицию для каждой записи после каждого перетаскивания с помощью функции sortable_element script.aculo.us.

Это пример действия контроллера, которое обрабатывает сортировку после завершения перетаскивания:

  def sort
    params[:documents].each_with_index do |id, index|
      Document.update_all(['position=?', index+1], ['id=?', id])
    end
  end

Теперь я пытаюсь сделать то же самое с моделью, которая представляет собой вложенный набор (acts_as_nested_set). Пример типа взаимодействия интерфейса: http://script.aculo.us/playground/test/functional/sortable_tree_test.html

Я застрял в том, как написать действие контроллера для обработки сортировки после завершения перетаскивания.

Я добавил параметр :tree=>true к сортируемой функции _element до сих пор, которая, кажется, отправляет список хэшей, но кажется, что мне все еще не хватает информации обо всем вложенном порядке....

Я был уверен, что это было сделано раньше, и не хотел пытаться изобретать велосипед, но я не могу найти примеры действия контроллера ‹-> view с настройкой функции js для обработки сортируемого acts_as_nested_set

Будем признательны за любую помощь в создании интерактивного сортируемого вложенного набора в rubyonrails!

Спасибо,

Джон


person Streamline    schedule 05.05.2009    source источник
comment
Использование потрясающего плагина вложенных наборов на случай, если кто-то заинтересован в помощи... он в основном расширяет исходный вложенный набор _set   -  person Streamline    schedule 06.05.2009
comment
Существуют ли встроенные способы сопоставления порядка, передаваемого из хэша параметров, всему вложенному набору всех элементов модели?   -  person Streamline    schedule 06.05.2009
comment
Мне нужно точно то же самое, построенное с помощью jQuery. В любом случае проголосовал за вас.   -  person Christoph Schiessl    schedule 02.09.2009


Ответы (5)


хорошее решение с ОДНИМ sql-запросом из http://henrik.nyh.se/2008/11/rails-jquery-sortables

# in your model:

def self.order(ids)
  update_all(
    ['ordinal = FIND_IN_SET(id, ?)', ids.join(',')],
    { :id => ids }
  )
end
person zed_0xff    schedule 01.11.2010
comment
Я думаю, что это работает только для списков, а не для вложенных наборов. С другой стороны, это решение только для MySQL. - person calas; 05.02.2011

см. пример приложения здесь - http://github.com/matenia/jQuery-Awesome-Nested-Set-Drag-and-Drop

Это хакерский способ сделать это, но в основном сначала сортируйте, а затем сохраняйте порядок. Использует вложенные сортируемые таблицы, список сериалов и 2 действия для обхода дерева.

PS: я знаю, что этому вопросу больше года, но надеюсь, что ссылка выше поможет кому-то еще прийти сюда.

редактировать: добавлен пример Rails3 с немного более чистым кодом.

person Matenia Rossides    schedule 05.09.2010

Только что нашел это:

sortable_element_for_nested_set на GitHub

Похоже, это сделает работу, однако у меня есть некоторые ошибки при попытке реализовать ее. В основном это заставляет javascript возвращать идентификатор перемещенного элемента, затем проходит через элементы и возвращает его новые родительские, левые и правые значения. Не могу поверить, что потребовалось так много времени, чтобы написать что-то подобное! К счастью, это было как раз тогда, когда мне это было нужно :)

person Community    schedule 25.05.2009

Вот фрагмент кода из моего проекта, который помогает:

http://gist.github.com/659532

 def reorder_children(ordered_ids)
    ordered_ids = ordered_ids.map(&:to_i)
    current_ids = children.map(&:id)
    unless current_ids - ordered_ids == [] && ordered_ids - current_ids == []
      raise ArgumentError, "Not ordering the same ids that I have as children. My children: #{current_ids.join(", ")}. Your list: #{ordered_ids.join(", ")}. Difference: #{(current_ids - ordered_ids).join(', ')} / #{(ordered_ids - current_ids).join(', ')}" 
    end
    j = 0
    transaction do
      for new_id in ordered_ids
        old_id = current_ids[j]
        if new_id == old_id
          j += 1
        else
          Category.find(new_id).move_to_left_of(old_id)
          current_ids.delete(new_id)
        end
      end
    end
  end

Вы вызываете его у родителя, и он сортирует дочерние элементы.

Вы просто передаете значение, полученное от Sortable, например:

  def reorder
    @category.reorder_children(params[:categories])
    render :nothing => true
  end

Надеюсь это поможет.

//Ларс

person Calvin Correli    schedule 02.11.2010

the_sortable_tree

Сортируемый вложенный набор для Rails 3.1+

Мечтаете о перетаскивании вложенных наборов? Это должно быть с JQuery? Вот решение!

person the-teacher    schedule 23.08.2011