2012-07-08 43 views
0

我正在使用這個寶石https://github.com/stefankroes/ancestry爲我的人員模型。該表是這樣的:如何獲取數組中所有對象的後代? (Rails +血統寶石)

+----+----------+ 
| 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/%")) 

產生像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"])) 

生成SQL語句並返回所有的孩子都1的(但不是孫子)和6我也知道:

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

回報什麼,因爲聲明作爲精確匹配。

我的問題是:我怎麼能把他們全部變成一個(可能是鏈接)查詢來獲得1和6的所有後代?在這個例子中,我預計結果是:[2,3,4,5,7,9,15,16,17,18,19]。

非常感謝你的建議

回答

2
People.select("id").where(People.arel_table[:ancestry].matches("1/%").or(People.arel_table[:ancestry].matches("6/%")) 
相關問題