Rails ActiveRecord: Verbindet sich mit LEFT JOIN anstelle von INNER JOIN


74

Ich habe diesen Code

User.find(:all, :limit => 10, :joins => :user_points,
                :select => "users.*, count(user_points.id)", :group =>
                "user_points.user_id")

das erzeugt folgende SQL

SELECT users.*, count(user_points.id) 
FROM `users` 
INNER JOIN `user_points` 
ON user_points.user_id = users.id 
GROUP BY user_points.user_id 
LIMIT 10

Ist es möglich, LEFT JOIN anstelle von INNER JOIN anders zu machen als User.find_by_sqldie Abfrage manuell einzugeben?

Antworten:


85

Sie können dies versuchen

User.find(:all, limit: 10,
            joins:  "LEFT JOIN `user_points` ON user_points.user_id = users.id" ,
            select: "users.*, count(user_points.id)", 
            group:  "user_points.user_id")

toll, genau das, wonach ich gesucht habe
Jakub Arnold

Es ist in Ordnung, aber was erwartet Jakub wirklich damit? Benutzer ohne Punkte? Wenn ja, denke ich, braucht es ein WHERE user_points.user_id IS NULL, nein?
Bernardo Loureiro

@Kylo Gibt es ein Konstrukt in Rails, um die linke Verknüpfung zu erstellen, ohne eine Zeichenfolge einzugeben?
BKSpurgeon

39

Nur zum späteren Nachschlagen gibt das Hinzufügen :alleine veraltete Nachricht. In späteren Versionen von Schienen können Sie die Methoden einfach wie folgt verketten:

User.joins("LEFT JOIN `user_points` ON user_points.user_id = users.id").select("users.*, count(user_points.id)").group("user_points.user_id")

ODER verwenden Sie einen Bereich wie diesen:

scope :my_scope_name_here, -> { 
        joins("LEFT JOIN `user_points` ON user_points.user_id = users.id")
        .select("users.*, count(user_points.id)")
        .group("user_points.user_id")
}

Sie können auch .wherezwischen dem .joinund dem verketten .select. Hoffe das hilft jemandem in der Zukunft.


14

Rails 5 verfügt über eine left_outer_joins- Methode. So können Sie tun

User.left_outer_joins(:user_points)

oder verwenden Sie den Alias

User.left_joins(:user_points)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.