3

我为 ruby​​ on rails使用了很棒的嵌套集插件。我该如何按 :name 列或其他内容进行排序?

目前显示树喜欢

A
- C
- B

我想要它喜欢

A
- B
- C
4

5 回答 5

7

这样做会覆盖数据库排序:

@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" 
于 2014-02-05T16:30:51.330 回答
4

不幸的是,现在不可能了。在他们的课堂上写道“通过 lft 以外的其他列进行 oding 不起作用”(lib/awesome_nested_set.rb)

于 2010-12-07T15:19:17.330 回答
2

已经在awesome_nested_set中实现

order_column:对哪一列进行排序,默认为left_column_name。示例:acts_as_nested_set :order_column => :position

closure_tree

如果您需要特定的顺序,请在 >migration 中向模型添加一个新的整数列:

t.integer :sort_order

在你的模型中:

class OrderedTag < ActiveRecord::Base
  has_closure_tree order: 'sort_order'
end
于 2017-05-25T16:17:31.510 回答
1

我确认@kr00lix 所说的。我绕过这个问题的方法:

@item_children = @item.children
@item_children = @item_children.sort_by!(&:your_sort_column)

但我同意,为了避免无用的内存消耗,直接在SQL命令中设置顺序会好很多。

于 2011-09-28T08:37:02.427 回答
0

我可以通过递归在 Rails 中做到这一点:

def add_self_and_children
  [self, children.sort_by{|e| e.name}.map{|c| c.add_self_and_children}].flatten
end

然后调用Model.root.add_self_and_children

但显然这涉及到一系列海量数据库命中。

因此,如果有人比我更了解 SQL 递归,并且想将其转换为纯 SQL,那就太神奇了!

顺便说一句,由于某种原因,以下对数据库会更友好的方法不起作用:

def add_self_and_children
  [self, children.order(:name).map{|c| c.add_self_and_children}].flatten
end
于 2015-08-26T23:13:34.493 回答