나는 다음과 같은 간단한 관계를 가지고 :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')
달성하려는 목표는 무엇입니까? 사용자가 가지고있는 모든 역할의 목록 만 원하면'User # roles'를 사용하십시오. – ArtOfCode