は、私は次のような単純な関係を持っている: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
です。
効率的なPostgreSQLクエリを作成しようとしています。このクエリは、すべてのユーザに対してすべてrole_names
のコンマ区切りリストを表示します。
これまでのところ、私はこれまでこれを持っていました。ただ一つの役割しか割り当てられていないとうまくいきました。別の役割を追加すると、重複するユーザーが発生します。これを解析するのではなく、string_agg()
functionを使用して、role_names
フィールドにカンマ区切りリストを返すようにしています。
これはこれまでの私の質問であり、この最後のステップを踏むのに失敗しています。
User.where(company_id: id)
.joins(:roles)
.select('distinct users.*, roles.name as role_name')
EDIT
私はそれは、生のSQL(グロス)を介して作業が、私はActiveRecordの形式に入れたときにレールがそれを理解する方法を知りません得ることができます
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