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)
Другие вопросы по тегам