6

我一直在实现一些不错的交互式界面,可以在我的 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 函数中,该函数似乎发送了一个哈希列表,但似乎我仍然缺少有关整个嵌套顺序的信息......

我确定这之前已经完成并且不想尝试重新发明轮子,但我似乎找不到任何控制器操作的示例 <-> 视图与 js 函数设置来处理可排序 acts_as_nested_set

任何有关在 ruby​​onrails 中创建交互式可排序嵌套集的帮助将不胜感激!

谢谢,

约翰

4

5 回答 5

2

一个很好的解决方案,来自http://henrik.nyh.se/2008/11/rails-jquery-sortables的一个 sql-query

# in your model:

def self.order(ids)
  update_all(
    ['ordinal = FIND_IN_SET(id, ?)', ids.join(',')],
    { :id => ids }
  )
end
于 2010-11-01T14:41:17.877 回答
2

在此处查看示例应用程序 - http://github.com/matenia/jQuery-Awesome-Nested-Set-Drag-and-Drop

这是一种 hacky 方式,但它基本上是先排序,然后保存顺序。使用nestedsortables、serializelist和2个动作遍历树

PS:我知道这个问题已经有一年多了,但希望上面的链接可以帮助其他人来这里。

编辑:添加了 Rails3 示例和一些更简洁的代码。

于 2010-09-05T01:01:01.920 回答
1

刚发现这个:

sortable_element_for_nested_set在github上

看起来它会完成这项工作,但是我在尝试实现它时遇到了一些错误。它基本上使 javascript 返回被移动元素的 id,然后遍历元素并返回其新的父级、左值和右值。不敢相信这么长时间才写出这样的东西!幸运的是,就在我需要它的时候:)

于 2009-05-25T23:49:02.620 回答
1

这是我项目中的一段代码,可以解决问题:

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

希望这可以帮助。

//拉尔斯

于 2010-11-02T11:58:51.860 回答
0

the_sortable_tree

Rails 3.1+ 的可排序嵌套集

梦见嵌套集的拖放?它应该与 JQuery 一起使用?这是解决方案!

于 2011-08-23T13:35:40.913 回答