0

나는 다음과 같은 간단한 관계를 가지고 :Rails에서이 PG 쿼리를 수행하는 방법?

class Company 
    has_many :users 
end 

class User 
    belongs_to :company 
    has_and_belongs_to_many :roles 
end 

class Role 
    has_and_belongs_to_many :users 
end 

중요한 유일한 열은 Role:name입니다.

각 사용자에 대해 모두 role_names의 쉼표로 구분 된 목록을 표시하는 효율적인 PostgreSQL 쿼리를 만들려고합니다.

지금까지는 단 한 개의 역할 만 할당하면 큰 성과를 얻었습니다. 다른 역할을 추가하면 중복 된 사용자가 생깁니다. 이 구문을 분석하는 대신, string_agg()function을 사용하여 쉼표로 구분 된 목록을 role_names 필드로 반환하려고합니다.

이것은 지금까지 내 쿼리이며이 최종 단계를 수행하는 데 실패했습니다.

User.where(company_id: id)        
    .joins(:roles)          
    .select('distinct users.*, roles.name as role_name') 

편집

나는 원시 SQL (총)를 통해 작동하지만 액티브 형식에 넣을 때 레일이 그것을 이해하는 방법을 알고하지 않습니다 얻을 수 있습니다

ActiveRecord::Base.connection.execute('SELECT users.*, string_agg("roles"."name", \',\') as roles FROM "users" INNER JOIN "roles_users" ON "roles_users"."user_id" = "users"."id" INNER JOIN "roles" ON "roles"."id" = "roles_users"."role_id" WHERE "users"."company_id" = 1 GROUP BY users.id') 

User.where(company_id: id) 
    .joins(:roles) 
    .select('users.*, string_agg("roles"."name" \',\')') 
    .group('users.id') 
+0

달성하려는 목표는 무엇입니까? 사용자가 가지고있는 모든 역할의 목록 만 원하면'User # roles'를 사용하십시오. – ArtOfCode

답변

0

외모 내게 당신이하고 싶어하는 :

User.roles.map(&:name).join(',') 

ionion SQL은 데이터베이스 작업을 할 때 더 좋은 선택이지만, 레일 위에있을 때는 Active Record로 가능한 한 많이해야합니다. 성능 문제를 염두에 두십시오!)

관련 문제