Program Tip

Rails ActiveRecord : INNER JOIN 대신 LEFT JOIN으로 조인합니다.

programtip 2020. 10. 29. 19:14
반응형

Rails ActiveRecord : INNER JOIN 대신 LEFT 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

INNER JOIN 대신 LEFT JOIN을 다른 방법으로 User.find_by_sql만들고 수동으로 쿼리를 입력하는 것이 가능합니까?


당신은 이것을 시도 할 수 있습니다

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하면 더 이상 사용되지 않는 메시지가 표시됩니다. 이후 버전의 레일에서는 다음과 같이 메서드를 간단히 연결할 수 있습니다.

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


Rails 5에는 left_outer_joins 메소드가 있습니다. 그래서 당신은 할 수 있습니다

User.left_outer_joins(:user_points)

또는 별칭 사용

User.left_joins(:user_points)

참고 URL : https://stackoverflow.com/questions/1509692/rails-activerecord-joins-with-left-join-instead-of-inner-join

반응형