0

私はこの宝石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 人が与えられた場合

  2. この 2 人のすべての子孫を取得する

  3. これをArel.orメソッドに入れる必要があるため、1つずつクエリするのではなく、1つのクエリで。

私はそれを使用して知っていました:

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 に答える