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?

Jakub Arnold
quelle

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")
Kylo
quelle
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.

8bithero
quelle
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)
Santhosh
quelle