Rails ActiveRecord: joint avec LEFT JOIN au lieu de INNER JOIN

J’ai ce code

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

qui génère la suite 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 

est-il possible de faire LEFT JOIN au lieu de INNER JOIN autrement que User.find_by_sql et manuellement en tapant la requête?

Vous pouvez essayer ceci

 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") 

Juste pour référence future, en ajoutant :all donne un message obsolète. Dans les versions ultérieures de rails, vous pouvez simplement enchaîner les méthodes comme ceci:

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

OU utilisez une scope comme celle-ci:

 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") } 

Vous pouvez également enchaîner .where entre le .join et le .select . J’espère que cela aidera quelqu’un dans le futur.

Rails 5 a une méthode left_outer_joins . Donc tu peux faire

 User.left_outer_joins(:user_points) 

ou utiliser l’alias

 User.left_joins(:user_points)