Как получить потомков всех объектов в массиве? (Рельсы + камень предков)

Я использую этот драгоценный камень https://github.com/stefankroes/ancestry для моего модуля "Люди". Таблица выглядит так:

+----+----------+
| id | ancestry |
+----+----------+
|  1 | NULL     |
|  2 | 1        |
|  3 | 1        |
|  4 | 1/2      |
|  5 | 1/3      |
|  6 | NULL     |
|  7 | 1/2      |
|  8 | 1/2      |
|  9 | 1/3      |
| 10 | NULL     |
| 11 | 10       |
| 12 | 10       |
| 13 | NULL     |
| 14 | NULL     |
| 15 | 6        |
| 16 | 6        |
| 17 | 6/16     |
| 18 | 6        |
| 19 | 6/18     |
| 20 | 14       |
+----+----------+

Я хочу запросить:

  1. даны два человека с id 1 и 6

  2. получить всех потомков этих двух людей

  3. в одном запросе вместо того, чтобы запрашивать один за другим, так как мне нужно поместить это в метод Arel.or.

Я знал, что используя:

People.select("id").where(People.arel_table[:ancestry].matches("6/%"))

генерирует оператор LIKE sql и возвращает всех внуков людей с идентификатором 6. Я также знал:

People.select("id").where(People.arel_table[:ancestry].matches(["1/%","6/%"]))

не работает, потому что генерирует неверный оператор LIKE:

SELECT id FROM `people` WHERE (`people`.`ancestry` LIKE '1/%', '6/%')

С другой стороны, я знал:

People.select("id").where(People.arel_table[:ancestry].in(["1", "6"]))

генерирует оператор IN sql и возвращает всех дочерних элементов (но не внуков) как 1, так и 6. Я также знал:

People.select("id").where(People.arel_table[:ancestry].in(["1/%", "6/%"]))

ничего не возвращает, потому что оператор IN работает как точное соответствие.

Тогда мой вопрос: как я могу поместить их все в (возможно, цепочку) запрос, чтобы получить всех потомков как 1, так и 6? В этом примере я ожидаю, что результат будет следующим: [ 2, 3, 4, 5, 7, 9, 15, 16, 17, 18, 19 ].

Большое спасибо за предложения


person Luke Huang    schedule 08.07.2012    source источник