Rails: rejoindre avec plusieurs conditions
J'ai un modèle simple comme
class Interest < ActiveRecord::Base
has_and_belongs_to_many :user_profiles
end
class UserProfile < ActiveRecord::Base
has_and_belongs_to_many :interests
end
Quand je veux l'interroger tous les utilisateurs avec des intérêts particuliers, c'est assez simple à faire
UserProfile.joins(:interests).where('interests.id = ?', an_interest)
Mais comment puis-je regarder pour les utilisateurs qui ont des intérêts multiples? Bien sûr, si je ne
UserProfile.joins(:interests).where('interests.id = ?', an_interest).where('interests.id = ?', another_interest)
Je reçois toujours un résultat vide, puisque, après les joindre, pas de ligne peut avoir simultanément intérêt.id = an_interest et de l'intérêt.id = another_interest.
Est-il un moyen de ActiveRecord pour exprimer "je veux la liste des utilisateurs qui ont 2 (spécifié) intérêts associés?
mise à jour (solution) c'est la première version de travail, je suis venu, bravo à Omar Qureshi
specified_interests.each_with_index do |i, idx|
main_join_clause = "interests_#{idx}.user_profile_id = user_profiles.id"
join_clause = sanitize_sql_array ["inner join interests_user_profiles interests_#{idx} on
(#{main_join_clause} and interests_#{idx}.interest_id = ?)", i]
relation = relation.joins(join_clause)
end
OriginalL'auteur Filippo Diotalevi | 2011-03-21
Vous devez vous connecter pour publier un commentaire.
dans (?) n'est pas bon - il de l'un OU comme l'expression
ce que vous devez faire est d'avoir plusieurs jointures écrit longhanded
Vous devrez peut-être modifier le main_join_clause pour répondre à vos besoins.
inner join interests_user_profiles
plutôt queinner join interests
comme vous l'avez écrit....et aussi remplacer
interests_#{idx}.id = ?
avecinterests_#{idx}.interest_id = ?
ah droit - c'est une M-à-M inscrire? ce serait plus logique, désolé de ne pas lire un peu! 😀
OriginalL'auteur Omar Qureshi
Cette obtiendrez les utilisateurs qui ont au moins l'un des intérêts.
D'obtenir des utilisateurs qui ont à la fois de l'intérêt, je le ferais probablement quelque chose comme ceci:
Pas étonnamment efficace, mais il devrait faire ce dont vous avez besoin?
UserProfile.joins(:interests).where("interests.id = ?" , [25, 26])
mais il ne fonctionne pasNon, cela ne fonctionne toujours pas. J'obtiens une erreur de syntaxe dans la requête
SELECT "user_profiles".* FROM "user_profiles" INNER JOIN "interests_user_profiles" ON "interests_user_profiles"."user_profile_id" = "user_profiles"."id" INNER JOIN "interests" ON "interests"."id" = "interests_user_profiles"."interest_id" WHERE (interests.id = 25,26)
Je viens de lire votre commentaire sur une autre réponse - je ne savais pas que vous aviez besoin d'une logique ET d'. Ma réponse va faire un OU.
Mise à jour de ma réponse
OriginalL'auteur Ant
Essayer
IN (?)
et un tableau:OriginalL'auteur Marcel Jackwerth