8
votes

Rails: rejoindre plusieurs conditions

J'ai un modèle simple comme xxx

lorsque je souhaite interroger tous les utilisateurs avec des intérêts spécifiques, c'est assez simple xxx < p> Mais comment puis-je rechercher des utilisateurs qui ont des intérêts multiples? Bien sûr, si je fais xxx

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?

Mise à jour (solution) c'est le Première version de travail que j'ai montée, Kudos à Omar Qureshi xxx


0 commentaires

3 Réponses :


2
votes

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


3 commentaires

J'ai essayé userprofile.joines (: intérêts). Où ("intérêt.id =?", [25, 26]) 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)


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.



-1
votes

Essayez dans (?) et un tableau: xxx


1 commentaires

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)



4
votes

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


3 commentaires

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 rejoindre INTERIATION_USER_PROFILES plutôt que INTERNE INTERIENNES Comme vous l'avez écrit.


... et également remplacer Intérêts _ # {IDX} .Id =? avec Intérêts _ # {IDX} .Interest_id =?


Ah droit - c'était une jointure m-to-m? Cela aurait un sens, désolé n'a pas lu ce morceau! :RÉ