1

我在两个模型之间有关系,RegistersCompetitions。我有一个非常复杂的动态查询正在构建中,如果条件合适,我需要将注册记录限制为仅其竞赛父级满足特定条件的那些。为了在没有从竞争表中选择的情况下做到这一点,我想了一些类似...

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

这会产生这个 SQL:

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

我不认为 PostgreSQL 喜欢 in 参数没有被括号包围的事实。如何将注册外键与竞赛 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 回答