Rails 3 Сравнение внешнего ключа со списком идентификаторов с использованием activerecord
У меня есть отношения между двумя моделями, Регистрами и Соревнованиями. У меня очень сложный динамический запрос, который создается, и если условия правильные, мне нужно ограничить регистрационные записи только теми, где родительский элемент соревнования соответствует определенным критериям. Чтобы сделать это без выбора из таблицы соревнований, я думал о чем-то вроде...
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 понравился тот факт, что входные параметры не заключены в круглые скобки. Как сравнить внешний ключ реестра со списком идентификаторов соревнований?
2 ответа
Решение
Вы можете сделать его немного короче и пропустить сбор (это работало для меня в 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)