如何获取数组中所有对象的后代? (Rails +祖先宝石)

时间:2012-07-08 20:14:33

标签: ruby-on-rails arel ancestry

我正在使用这个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. 给两位身份为1和6的人

  2. 获取这两个人的所有后代

  3. 在一个查询中,而不是逐个查询,因为我需要将它放入Arel.or方法中。

  4. 我知道使用:

    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]。

    非常感谢您的建议

1 个答案:

答案 0 :(得分:2)

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