Schienen: join mit mehreren Bedingungen
Habe ich ein einfaches Modell wie
class Interest < ActiveRecord::Base
has_and_belongs_to_many :user_profiles
end
class UserProfile < ActiveRecord::Base
has_and_belongs_to_many :interests
end
Wenn ich Abfragen möchte alle Benutzer mit einem bestimmten Interesse, das ist ziemlich einfach zu tun
UserProfile.joins(:interests).where('interests.id = ?', an_interest)
Aber wie kann ich für Benutzer, die mehrere Interessen? Natürlich, wenn ich
UserProfile.joins(:interests).where('interests.id = ?', an_interest).where('interests.id = ?', another_interest)
Bekomme ich immer ein leeres Ergebnis, da nach dem Beitritt, keine Zeile können gleichzeitig Interesse.id = an_interest und Interesse.id = another_interest.
Gibt es eine Möglichkeit in ActiveRecord zum express, "ich will die Liste der Benutzer 2 (angegebenen) Interessen verknüpft?
update (Lösung) das ist die erste funktionierende version, die ich gekommen, ein dickes Lob an 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
Du musst angemeldet sein, um einen Kommentar abzugeben.
in (?) ist nicht gut - es ist eine ODER wie Ausdruck
was Sie tun müssen, ist, mehrere joins geschrieben longhanded Variante
Müssen Sie möglicherweise ändern Sie die main_join_clause, um Ihre Bedürfnisse anzupassen.
inner join interests_user_profiles
eher alsinner join interests
wie du geschrieben hast.interests_#{idx}.id = ?
mitinterests_#{idx}.interest_id = ?
Diese erhalten Benutzer, die mindestens eines der angegebenen Interessen.
Bekommen Nutzer, die über die angegebenen Interessen wäre, würde ich wahrscheinlich etwas wie das hier tun:
Nicht wirklich effizient, aber es sollte das tun, was Sie brauchen?
UserProfile.joins(:interests).where("interests.id = ?" , [25, 26])
aber es hat nicht funktioniertSELECT "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)
Versuchen
IN (?)
und ein array: