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

25

У меня есть модель 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   ответа
42

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

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

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

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

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

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

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

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

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

Похожие вопросы