0

我将这个 gem https://github.com/stefankroes/ancestry用于我的 People 模型。该表如下所示:

+----+----------+
| 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 语句并返回 id 为 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 ]。

非常感谢您的建议

4

1 回答 1

2
People.select("id").where(People.arel_table[:ancestry].matches("1/%").or(People.arel_table[:ancestry].matches("6/%"))
于 2012-07-09T17:31:24.283 回答