Rails ActiveRecord:使用LEFT JOIN而不是INNER JOIN进行连接

75

我有这段代码

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

生成以下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

除了使用User.find_by_sql并手动键入查询之外,是否有其他方法可以使LEFT JOIN替代INNER JOIN?

3个回答

85

你可以尝试这个

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

非常好,正是我想要的。 - Jakub Arnold
可以,但Jakub真正期望的是什么呢?没有积分的用户吗?如果是这样,我认为需要加上WHERE user_points.user_id IS NULL,对吧? - Bernardo Loureiro
@Kylo 在 Rails 中是否有一种构造函数可以创建左连接而无需键入字符串? - BenKoshy

40

仅作为将来的参考,添加:all会收到弃用信息。在Rails的后续版本中,您可以像这样简单地链接方法:

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

或者使用类似这样的作用域(scope)


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")
}
你还可以在 .join.select 之间链式使用 .where。 希望这能帮助未来的某个人。

18

Rails 5引入了left_outer_joins方法,因此您可以执行以下操作:

User.left_outer_joins(:user_points)

或使用别名

User.left_joins(:user_points)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接