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

У меня есть модель User, и у пользователя есть отношение, которое имеет has_many pets. Я хочу иметь возможность написать запрос ActiveRecord, в котором я могу выбрать всех пользователей с домашним животным, у которого нет имени питомца «пушистый».

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

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

Ответы на вопрос(3)

Решение Вопроса

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

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

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

 04 мая 2015 г., 04:07
@ jeffdill2 Это зависит от того, как определяется ассоциация. Если пользовательhas_one :petНапример, вы были бы правы.
 18 дек. 2014 г., 16:01
Пожалуйста, исправьте меня, если я ошибаюсь, но это не так. User.joins (: pet) ... ... - единственное число - для параметра символа?
 04 мая 2015 г., 15:00
@MikeC ах, отлично.

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

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

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

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

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

Ваш ответ на вопрос