Ответ 1
Это должно работать:
User.joins(:pets).where("pets.name != 'fluffy'")
Также вы можете прочитать следующую часть (на joins
) в официальных рекомендациях RoR.
У меня есть модель пользователя, и у пользователя есть отношения, в которых есть домашние животные. Я хочу, чтобы иметь возможность написать запрос ActiveRecord, где я могу выбрать всех пользователей с домашним животным, у которого нет pet.name "пушистый"
Какой самый эффективный способ написать это с помощью ActiveRecord? Используя прямой SQL, он будет выглядеть примерно так:
select id from users INNER JOIN pets ON u.id = pets.user_id WHERE pets.name != "fluffy"
Это должно работать:
User.joins(:pets).where("pets.name != 'fluffy'")
Также вы можете прочитать следующую часть (на joins
) в официальных рекомендациях RoR.
В рельсах 4 вы можете сделать это еще более понятным:
User.joins(:pets).where.not(pets: { name: 'fluffy' })
Самый чистый путь без уязвимости SQL-инъекции - это использование параметров запроса:
User.joins(:pets).where("pets.name != ?", "fluffy")
Некоторые драйверы базы данных будут использовать подготовленные выше инструкции для повторного использования плана запросов к базе данных. В таком случае база данных не должна анализировать запрос снова, когда изменяется только значение параметра.