答案 0 :(得分:5)
这样做会覆盖数据库排序:
@item.children.except(:order).order("your_sort_column")
示例:
organization.self_and_descendants.to_sql
=> "SELECT `organizations`.* FROM `organizations` WHERE (`organizations`.`lft` >= 1 AND `organizations`.`lft` < 54) ORDER BY `organizations`.`lft`"
organization.self_and_descendants.except(:order).order("organization_nm").to_sql
=> "SELECT `organizations`.* FROM `organizations` WHERE (`organizations`.`lft` >= 1 AND `organizations`.`lft` < 54) ORDER BY organization_nm"
答案 1 :(得分:3)
不幸的是现在不可能。 在他们的课堂上写的“用lft之外的其他列进行操作不起作用”(lib / awesome_nested_set.rb)
答案 2 :(得分:2)
order_column:在哪个列上进行排序,默认情况下是 left_column_name。示例:acts_as_nested_set:order_column =&gt; :位置
如果您需要特定订单,请在&gt;迁移中为模型添加新的整数列:
t.integer :sort_order
并在您的模型中:
class OrderedTag < ActiveRecord::Base
has_closure_tree order: 'sort_order'
end
答案 3 :(得分:1)
我确认@ kr00lix说的是什么。 我绕过这个问题的方法:
@item_children = @item.children
@item_children = @item_children.sort_by!(&:your_sort_column)
但我同意,为了避免无用的内存消耗,直接在SQL命令中设置顺序会更好。
答案 4 :(得分:0)
我能够使用递归在Rails中执行此操作:
AnyObject
然后拨打import scala.collection.mutable.MutableList
var x = false
while (!x) {
val list = MutableList[Any]()
val input = scala.io.StdIn.readLine("input pls:\n")
list += input
if (input == "end"){ x = true ; println("Bye!"); sys.exit}
if (input =="show") {println(list)}
}
。
但显然这涉及一系列大规模的数据库命中。
因此,如果有人知道更多关于SQL递归的信息,而不是我希望将其转换为纯SQL,那就太神奇了!
BTW,出于某种原因,以下内容对数据库来说有点小,但是没有用:def add_self_and_children
[self, children.sort_by{|e| e.name}.map{|c| c.add_self_and_children}].flatten
end