Как создать сортируемый интерфейс с «действует как вложенный набор» в RubyOnRails - PullRequest
6 голосов
/ 05 мая 2009

Я реализовал несколько хороших интерактивных интерфейсов, которые могут сортировать списки в моем приложении m rails для моделей, использующих acts_as_list. У меня есть функция сортировки, которая вызывается и устанавливает положение для каждой записи после каждого перетаскивания, используя функцию scripttable_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, которая, похоже, отправляет список хэшей, но, похоже, мне все еще не хватает информации обо всем вложенном порядке ....

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

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

Спасибо

John

Ответы [ 5 ]

2 голосов
/ 05 сентября 2010

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

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

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

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

2 голосов
/ 01 ноября 2010

хорошее решение с ОДНЫМ 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
1 голос
/ 02 ноября 2010

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

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

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

// Lars

1 голос
/ 26 мая 2009

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

sortable_element_for_nested_set на github

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

0 голосов
/ 23 августа 2011

the_sortable_tree

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

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

...