web-dev-qa-db-fra.com

Ruby on Rails requête ActiveRecord utilisant une jointure)

J'ai un modèle d'utilisateur et l'utilisateur a une relation qui a de nombreux animaux. Je veux pouvoir écrire une requête ActiveRecord où je peux sélectionner tous les utilisateurs avec un animal domestique qui n'a pas d'animal familier. Nom de "moelleux"

Quelle est la façon la plus efficace d'écrire ceci en utilisant ActiveRecord? En utilisant du SQL simple, il ressemblerait à quelque chose comme ceci:

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

29
randombits

Cela devrait fonctionner:

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

Aussi, vous voudrez peut-être lire partie suivante (sur joins) sur les directives officielles de RoR.

50
Amokrane Chentir

Dans Rails 4, vous pouvez rendre cela encore plus clair:

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

La manière la plus propre sans vulnérabilité d'injection SQL consiste à utiliser les paramètres de requête:

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

Certains pilotes de base de données utiliseront les instructions préparées ci-dessus pour réutiliser le plan de requête de base de données. Dans ce cas, la base de données n'a pas besoin d'analyser à nouveau la requête lorsque seule la valeur du paramètre varie.

17
gertas