Получить немедленные подкаталоги в рубине

Что-то, о чем здесь не упоминалось, хотя и немного похоже на вторую альтернативу принятого ответа, но отличается и невысокой стоимостью для большого иерархического запроса и простых элементов (insert update delete), будет добавлять столбец постоянных путей для каждого элемента.

some like:

id | name        | path
19 | category1   | /19
20 | category2   | /19/20
21 | category3   | /19/20/21
22 | category4   | /19/20/21/22

Пример:

-- get children of category3:
SELECT * FROM my_table WHERE path LIKE '/19/20/21%'
-- Reparent an item:
UPDATE my_table SET path = REPLACE(path, '/19/20', '/15/16') WHERE path LIKE '/19/20/%'

Оптимизировать длину пути и ORDER BY path, используя кодировку base36, вместо этого действительный числовой идентификатор пути

]

 // base10 => base36
 '1' => '1',
 '10' => 'A',
 '100' => '2S',
 '1000' => 'RS',
 '10000' => '7PS',
 '100000' => '255S',
 '1000000' => 'LFLS',
 '1000000000' => 'GJDGXS',
 '1000000000000' => 'CRE66I9S'

https://en.wikipedia.org/wiki/Base36

Подавление разделителя '/' с помощью фиксированной длины и отступов до encoded id

Подробное объяснение оптимизации здесь: https://bojanz.wordpress.com/2014/04/25/storing-hierarchical-data-materialized-path/

TODO

построение функции или процедуры для разделения пути для возвращающих предков одного элемента

20
задан Clay Bridges 6 July 2018 в 16:52
поделиться

3 ответа

Dir.glob ("** /") вернет массив всех путей под текущим каталогом. Оттуда вы можете отфильтровать список и скопировать файл с помощью File.copy (от, до)

17
ответ дан 29 November 2019 в 22:28
поделиться

Если вы хотите найти все непосредственные подкаталоги (всего на один уровень ниже того места, где вы находитесь), попробуйте следующее:

Dir.chdir("/some/path/you/want/to/check/below")
subdir_list=Dir["*"].reject{|o| not File.directory?(o)}

То есть: изменить каталог где-нибудь, построить найденный там массив файлов, отбросьте те элементы массива, которые не являются каталогами, и верните полученный массив данных.

11
ответ дан 29 November 2019 в 22:28
поделиться

Предполагая, что вам нужны только подкаталоги немедленных , вы можете использовать Dir ['* /'] (который объединяет ответы Майкла Сепкота и Гленры).

62
ответ дан 29 November 2019 в 22:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: