J'ai un modèle simple comme lorsque je souhaite interroger tous les utilisateurs avec des intérêts spécifiques, c'est assez simple p> Je reçois toujours un résultat vide, car après la jointure, aucune ligne ne peut avoir simultanément intérêt.id = an_interest et intérêt.id = autre_interest. < / p> existe un moyen d'exprimer "Je souhaite la liste des utilisateurs qui ont 2 intérêts (spécifiés) associés? p> Mise à jour (solution) forte> c'est le Première version de travail que j'ai montée, Kudos à Omar Qureshi P>
3 Réponses :
Cela permettra aux utilisateurs d'avoir au moins l'un des intérêts spécifiés.
def self.all_with_interests(interest_1, interest_2) users_1 = UserProfile.where("interests.id = ?", interest_1.id) users_2 = UserProfile.where("interests.id = ?", interest_2.id) users_1 & users_2 end
J'ai essayé userprofile.joines (: intérêts). Où ("intérêt.id =?", [25, 26]) code> mais ça n'a pas fonctionné
Non, ça ne marche toujours pas. Je reçois une erreur de syntaxe dans la requête Sélectionnez "user_profiles". * Dans "user_profiles" rejoindre interne "Inteint_user_profiles" sur "Inverse_User_Profiles". "User_profile_id" = "user_profiles". "ID" INTERNIER "INTERNIÈRES" SUR "INTÉRÊTS "." ID "=" INTERIATION_USER_PROFILES "." INTERVENTION_ID "Où (intérêt.id = 25,26) code>
Je viens de lire votre commentaire sur une autre réponse - je n'ai pas réalisé que vous aviez besoin d'une logique et. Ma réponse fera un ou.
Essayez dans (?) code> et un tableau:
La clause dans la clause est logique ou (a un intérêt ou l'autre ou les deux) ... J'ai besoin d'une logique et (a tous les intérêts)
in (?) n'est pas bon - c'est une expression ou une expression similaire
Ce que vous devrez faire, c'est avoir plusieurs jointures écriées sur la sangghage p>
profiles = UserProfile interest_ids.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 interests_#{idx} on (#{main_join_clause} and interests_#{idx}.id = ?)", i] profiles = profiles.join(join_clause) end profiles
C'est bien plus compliqué que j'espérais :)! Mais tu m'as certainement signalé à la bonne direction. Merci. La seule différence est que je devais INTERNE INTERIENNES CODE> Comme vous l'avez écrit.
... et également remplacer Intérêts _ # {IDX} .Id =? code> avec
Intérêts _ # {IDX} .Interest_id =? Code>
Ah droit - c'était une jointure m-to-m? Cela aurait un sens, désolé n'a pas lu ce morceau! :RÉ