потрясающий порядок вложенных множеств - PullRequest
3 голосов
/ 28 августа 2009

Я использую плагин для вложенного набора для ruby ​​на рельсах. Как мне сортировать по: столбцу имени или как-то еще?

В настоящее время показывает дерево, как

A
- C
- B

Я хочу это как

A
- B
- C

Ответы [ 5 ]

5 голосов
/ 05 февраля 2014

Это отменяет сортировку базы данных:

@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" 
4 голосов
/ 07 декабря 2010

К сожалению, сейчас это невозможно. В их классе написано, что «odering другим столбцом, кроме lft, не работает» (lib / awesome_nested_set.rb)

2 голосов
/ 25 мая 2017

Уже реализовано в awesome_nested_set

order_column: по какому столбцу выполнять сортировку, по умолчанию это left_column_name. Пример: acts_as_nested_set: order_column => : Положение

и closure_tree

Если вы хотите определенный порядок, добавьте новый целочисленный столбец в модель в> миграции:

t.integer :sort_order

и в вашей модели:

class OrderedTag < ActiveRecord::Base
  has_closure_tree order: 'sort_order'
end
1 голос
/ 28 сентября 2011

Я подтверждаю, что сказал @ kr00lix. Мой способ обойти эту проблему:

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

Но я согласен с тем, что во избежание бесполезного потребления памяти было бы гораздо лучше установить порядок в команде SQL напрямую.

0 голосов
/ 27 августа 2015

Я смог сделать это в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...