module Groupify::Mongoid::Group::ClassMethods

Public Instance Methods

default_member_class() click to toggle source
# File lib/groupify/adapter/mongoid/group.rb, line 54
def default_member_class
  @default_member_class ||= User rescue false
end
default_member_class=(klass) click to toggle source
# File lib/groupify/adapter/mongoid/group.rb, line 58
def default_member_class=(klass)
  @default_member_class = klass
end
has_members(*names) click to toggle source

Define which classes are members of this group

# File lib/groupify/adapter/mongoid/group.rb, line 68
def has_members(*names)
  Array.wrap(names.flatten).each do |name|
    klass = name.to_s.classify.constantize
    register(klass)
  end
end
member_classes() click to toggle source

Returns the member classes defined for this class, as well as for the super classes

# File lib/groupify/adapter/mongoid/group.rb, line 63
def member_classes
  (@member_klasses ||= Set.new).merge(superclass.method_defined?(:member_classes) ? superclass.member_classes : [])
end
merge!(source_group, destination_group) click to toggle source

Merge two groups. The members of the source become members of the destination, and the source is destroyed.

# File lib/groupify/adapter/mongoid/group.rb, line 76
def merge!(source_group, destination_group)
  # Ensure that all the members of the source can be members of the destination
  invalid_member_classes = (source_group.member_classes - destination_group.member_classes)
  invalid_member_classes.each do |klass|
    if klass.in(group_ids: [source_group.id]).count > 0
      raise ArgumentError.new("#{source_group.class} has members that cannot belong to #{destination_group.class}")
    end
  end

  source_group.member_classes.each do |klass|
    klass.in(group_ids: [source_group.id]).update_all(:$set => {:"group_ids.$" => destination_group.id})

    if klass.relations['group_memberships']
      if ::Mongoid::VERSION > "4"
        klass.in(:"group_memberships.group_ids" => [source_group.id]).add_to_set(:"group_memberships.$.group_ids" => destination_group.id)
        klass.in(:"group_memberships.group_ids" => [source_group.id]).pull(:"group_memberships.$.group_ids" => source_group.id)
      else
        klass.in(:"group_memberships.group_ids" => [source_group.id]).add_to_set(:"group_memberships.$.group_ids", destination_group.id)
        klass.in(:"group_memberships.group_ids" => [source_group.id]).pull(:"group_memberships.$.group_ids", source_group.id)
      end
    end
  end

  source_group.delete
end
with_member(member) click to toggle source
# File lib/groupify/adapter/mongoid/group.rb, line 50
def with_member(member)
  member.groups
end

Protected Instance Methods

associate_member_class(member_klass) click to toggle source
# File lib/groupify/adapter/mongoid/group.rb, line 140
def associate_member_class(member_klass)
  association_name ||= member_klass.model_name.plural.to_sym

  has_many association_name, class_name: member_klass.to_s, dependent: :nullify, foreign_key: 'group_ids', extend: MemberAssociationExtensions

  if member_klass == default_member_class
    has_many :members, class_name: member_klass.to_s, dependent: :nullify, foreign_key: 'group_ids', extend: MemberAssociationExtensions
  end
end
register(member_klass) click to toggle source
# File lib/groupify/adapter/mongoid/group.rb, line 104
def register(member_klass)
  (@member_klasses ||= Set.new) << member_klass
  associate_member_class(member_klass)
  member_klass
end