0

私が書いているアプリには、任意の数のグループに属する可能性のあるユーザーがいます。対応する group_membership モデルによる has_many 関係が存在します。

レポート インターフェイスに取り組んでおり、グループでフィルター処理したいので、リストされているすべてのグループに属するユーザーを返したいと考えています (他の追加グループに属している場合でも)。

現在、各グループへのメンバーシップに基づいて一連のユーザーを順番にフィルタリングし、現在のグループのメンバーでないユーザーは除外されるようにしています。

  @users = @account.users.joins(:groups).where("groups.id in (?)",all_groups).pluck('users.id') #All user IDs
  positions_users = @account.users.joins(:groups).where("groups.id in (?)",positions).pluck('users.id') unless positions.empty?
  departments_users = @account.users.joins(:groups).where("groups.id in (?)",departments).pluck('users.id') unless departments.empty?     
  locations_users = @account.users.joins(:groups).where("groups.id in (?)",locations).pluck('users.id') unless locations.empty?     
  miscellaneous_users = @account.users.joins(:groups).where("groups.id in (?)",miscellaneous).pluck('users.id') unless miscellaneous.empty? 


  @users = @users.select {|x| positions_users.include? x } unless positions_users.nil? || positions_users.empty?
  @users = @users.select {|x| departments_users.include? x } unless departments_users.nil? || departments_users.empty?
  @users = @users.select {|x| locations_users.include? x } unless locations_users.nil? || locations_users.empty? 
  @users = @users.select {|x| miscellaneous_users.include? x } unless miscellaneous_users.nil? || miscellaneous_users.empty?

これを行うより効率的な方法はありますか?

4

1 に答える 1

1

結合モデルがあると仮定するとUserGroup、次のスコープを追加できます。

class UserGroup
  scope :group_filter, lambda{|*groups|
    group_ids = groups.flatten.compact.uniq
    return self if group_ids.blank?
    where(:group_id => group_ids)
  }
end

今、あなたはこれを行うことができます:

filter = UserGroup.group_filter(positions, departments, locations, miscellaneous)
@users = @account.users.joins(:user_groups).merge(filter)

そしてあなたの完了!

于 2013-06-24T17:25:06.703 に答える