lib/groupify/adapter/mongoid/named_group_collection.rb
module Groupify
module Mongoid
module NamedGroupCollection
# Criteria to filter by membership type
def as(membership_type)
return self unless membership_type
membership = @member.group_memberships.as(membership_type).first
if membership
membership.named_groups
else
self.class.new
end
end
def <<(named_group, opts={})
named_group = named_group.to_sym
super(named_group)
uniq!
if @member && opts[:as]
membership = @member.group_memberships.find_or_initialize_by(as: opts[:as])
membership.named_groups << named_group
membership.save!
end
self
end
def merge(*args)
opts = args.extract_options!
named_groups = args.flatten
named_groups.each do |named_group|
add(named_group, opts)
end
end
def delete(*args)
opts = args.extract_options!
named_groups = args.flatten
if @member
if opts[:as]
membership = @member.group_memberships.as(opts[:as]).first
if membership
if ::Mongoid::VERSION > "4"
membership.pull_all(named_groups: named_groups)
else
membership.pull_all(:named_groups, named_groups)
end
end
return
else
memberships = @member.group_memberships.where(:named_groups.in => named_groups)
memberships.each do |membership|
if ::Mongoid::VERSION > "4"
membership.pull_all(named_groups: named_groups)
else
membership.pull_all(:named_groups, named_groups)
end
end
end
end
named_groups.each do |named_group|
super(named_group)
end
end
def self.extended(base)
base.class_eval do
attr_accessor :member
alias_method :delete_all, :clear
alias_method :destroy_all, :clear
alias_method :push, :<<
alias_method :add, :<<
alias_method :concat, :merge
alias_method :destroy, :delete
end
end
end
end
end