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_sql
die Abfrage manuell einzugeben?
ruby-on-rails
activerecord
join
left-join
inner-join
Jakub Arnold
quelle
quelle
WHERE user_points.user_id IS NULL
, nein?Nur zum späteren Nachschlagen gibt das Hinzufügen
:all
eine 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
.where
zwischen dem.join
und dem verketten.select
. Hoffe das hilft jemandem in der Zukunft.quelle
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)
quelle