Подтвердить что ты не робот

Запрос Ruby on Rails ActiveRecord с использованием соединения

У меня есть модель пользователя, и у пользователя есть отношения, в которых есть домашние животные. Я хочу, чтобы иметь возможность написать запрос ActiveRecord, где я могу выбрать всех пользователей с домашним животным, у которого нет pet.name "пушистый"

Какой самый эффективный способ написать это с помощью ActiveRecord? Используя прямой SQL, он будет выглядеть примерно так:

select id from users INNER JOIN pets ON u.id = pets.user_id WHERE pets.name != "fluffy"

4b9b3361

Ответ 1

Это должно работать:

User.joins(:pets).where("pets.name != 'fluffy'")

Также вы можете прочитать следующую часть (на joins) в официальных рекомендациях RoR.

Ответ 2

В рельсах 4 вы можете сделать это еще более понятным:

User.joins(:pets).where.not(pets: { name: 'fluffy' })

Ответ 3

Самый чистый путь без уязвимости SQL-инъекции - это использование параметров запроса:

User.joins(:pets).where("pets.name != ?", "fluffy")

Некоторые драйверы базы данных будут использовать подготовленные выше инструкции для повторного использования плана запросов к базе данных. В таком случае база данных не должна анализировать запрос снова, когда изменяется только значение параметра.