2009-10-02 2 views
65

이 코드가Rails ActiveRecord : 내부 조인 대신 LEFT JOIN 조인

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

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 만들 수 있습니까?

답변

82

당신은 :all가되지 않는 메시지를 제공 추가, 그냥 나중에 참조 할 수 있도록이

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

큰, 내가 –

+0

찾고 정확히 무엇을 그것은 OK,하지만 야쿱 정말 무엇을 기대하는거야? 포인트가없는 사용자는? 그렇다면'WHERE user_points.user_id IS NULL'이 필요하다고 생각합니다? –

+0

@Kylo에는 문자열을 입력하지 않고 왼쪽 조인을 만들기위한 레일스 구조가 있습니까? – BKSpurgeon

36

을 시도 할 수 있습니다.

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

는 또한 .join.select 사이 .where 체인 수 있습니다. 앞으로 도움이되기를 바랍니다.

2

레일 5는 left_outer_joins 방법을 갖는다. 그래서 별칭을

User.left_outer_joins(:user_points) 

을하거나 사용할 수 있습니다

User.left_joins(:user_points)