2016-09-04 10 views
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です。

効率的な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') 
+0

達成しようとしていることは何ですか?ユーザが持っているすべてのロールのリストが必要な場合は、 'User#roles'を使います。 – ArtOfCode

答えて

0

ルックスあなたにやりたいことに私に:

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

ionion SQLはデータベースを扱う際のより良い選択ですが、あなたがレール上にいるときはActive Recordでできるだけ多くのことを行うべきです。パフォーマンスの問題に注意してください)

関連する問題