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

我有这个密码

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和手动键入查询?

74396 次浏览

你可以试试这个

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

只是为了将来参考,添加 :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 :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")
}

您也可以链 .where之间的 .join.select。 希望这能帮到将来的某个人。

Rails5有一个 Left _ out- 连接方法

User.left_outer_joins(:user_points)

或者用化名

User.left_joins(:user_points)