j'ai un modèle simple commeRails: se joindre à plusieurs conditions
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 interroger tous les utilisateurs ayant un intérêt spécifique, ce qui est assez simple à faire
UserProfile.joins(:interests).where('interests.id = ?', an_interest)
Mais comment chercher des utilisateurs qui ont des intérêts multiples? Bien sûr, si je
UserProfile.joins(:interests).where('interests.id = ?', an_interest).where('interests.id = ?', another_interest)
Je reçois toujours un résultat vide, car après la jointure, aucune ligne ne peut avoir en même temps interest.id = an_interest et interest.id = another_interest.
est-il un moyen ActiveRecord d'exprimer « Je veux la liste des utilisateurs qui ont 2 intérêts (spécifié) associé?
mise à jour (solution) qui 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
C'est beaucoup plus compliqué que j'espérais :)! Mais vous m'avez certainement indiqué la bonne direction. Merci. La seule différence est que je devais 'inner join interests_user_profiles' plutôt que' inner join interests' comme vous l'avez écrit. –
... et remplacez aussi 'interests _ # {idx} .id =?' Par 'interests _ # {idx} .interest_id =?' –
ah à droite - c'était une jointure M-to-M? cela aurait du sens, désolé n'a pas lu ce morceau! :RÉ –