我正在使用这个gemhttps://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 |
+----+----------+
我想查询的是:
给定id为1和6的两个人
让这两个人的所有后代
在一个查询中,而不是逐个查询,因为我需要将其放入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]。
非常感谢您的建议
People.select("id").where(People.arel_table[:ancestry].matches("1/%").or(People.arel_table[:ancestry].matches("6/%"))