1

私は2つのモデル、レジスターコンペティションの間に関係があります。作成中の非常に複雑な動的クエリがあります。条件が正しければ、登録レコードを、競争の親が特定の基準を満たすレコードのみに制限する必要があります。競争テーブルから選択せずにこれを行うために、私は次のようなことを考えていました...

Register.where("competition_id in ?", Competition.where("...").collect {|i| i.id})

これはこのSQLを生成します:

SELECT "registers".* FROM "registers" WHERE (competition_id in 1,2,3,4...)

inパラメータが括弧で囲まれていないという事実をPostgreSQLが気に入ったとは思いません。Register外部キーを競合IDのリストと比較するにはどうすればよいですか?

4

2 に答える 2

3

あなたはそれを少し短くして、収集をスキップすることができます(これは3.2.3で私のために働きました)。

Register.where(competition_id: Competition.where("..."))

これにより、次のSQLが生成されます。

SELECT "registers".* FROM "registers" WHERE "registers"."competition_id" IN (SELECT "competitions"."id" FROM "competitions" WHERE "...")
于 2012-06-22T20:40:58.950 に答える
1

代わりにこれを試してください:

competitions = Competition.where("...").collect {|i| i.id}
Register.where(:competition_id => competitions)
于 2012-06-22T17:00:34.323 に答える