我为 ruby on rails使用了很棒的嵌套集插件。我该如何按 :name 列或其他内容进行排序?
目前显示树喜欢
A
- C
- B
我想要它喜欢
A
- B
- C
这样做会覆盖数据库排序:
@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"
不幸的是,现在不可能了。在他们的课堂上写道“通过 lft 以外的其他列进行 oding 不起作用”(lib/awesome_nested_set.rb)
order_column:对哪一列进行排序,默认为left_column_name。示例:acts_as_nested_set :order_column => :position
如果您需要特定的顺序,请在 >migration 中向模型添加一个新的整数列:
t.integer :sort_order
在你的模型中:
class OrderedTag < ActiveRecord::Base
has_closure_tree order: 'sort_order'
end
我确认@kr00lix 所说的。我绕过这个问题的方法:
@item_children = @item.children
@item_children = @item_children.sort_by!(&:your_sort_column)
但我同意,为了避免无用的内存消耗,直接在SQL命令中设置顺序会好很多。
我可以通过递归在 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