我有两个模型之间的关系,寄存器和竞赛。我有一个非常复杂的动态查询正在构建中,如果条件合适,我需要将注册记录限制为仅那些符合特定标准的竞赛父记录。为了在不从比赛表中进行选择的情况下做到这一点,我在想一些类似的事情......
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 列表进行比较?
您可以使其更短一点并跳过集合(这在 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 "...")
试试这个:
competitions = Competition.where("...").collect {|i| i.id}
Register.where(:competition_id => competitions)