module Groupify::ActiveRecord::Group::ClassMethods

Public Instance Methods

default_member_class() click to toggle source
# File lib/groupify/adapter/active_record/group.rb, line 57
def default_member_class
  @default_member_class ||= (User rescue false)
end
default_member_class=(klass) click to toggle source
# File lib/groupify/adapter/active_record/group.rb, line 61
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/active_record/group.rb, line 71
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/active_record/group.rb, line 66
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/active_record/group.rb, line 79
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.joins(:group_memberships_as_member).where(:group_memberships => {:group_id => source_group.id}).count > 0
      raise ArgumentError.new("#{source_group.class} has members that cannot belong to #{destination_group.class}")
    end
  end

  source_group.transaction do
    source_group.group_memberships_as_group.update_all(:group_id => destination_group.id)
    source_group.destroy
  end
end
with_member(member) click to toggle source
# File lib/groupify/adapter/active_record/group.rb, line 52
def with_member(member)
  #joins(:group_memberships).where(:group_memberships => {:member_id => member.id, :member_type => member.class.to_s})
  member.groups
end

Protected Instance Methods

associate_member_class(member_klass) click to toggle source
# File lib/groupify/adapter/active_record/group.rb, line 138
def associate_member_class(member_klass)
  define_member_association(member_klass)

  if member_klass == default_member_class
    define_member_association(member_klass, :members)
  end
end
define_member_association(member_klass, association_name = nil) click to toggle source
# File lib/groupify/adapter/active_record/group.rb, line 146
def define_member_association(member_klass, association_name = nil)
  association_name ||= member_klass.model_name.plural.to_sym
  source_type = member_klass.base_class

  has_many association_name,
           ->{ distinct },
           through: :group_memberships_as_group,
           source: :member,
           source_type: source_type.to_s,
           extend: MemberAssociationExtensions
end
register(member_klass) click to toggle source
# File lib/groupify/adapter/active_record/group.rb, line 96
def register(member_klass)
  (@member_klasses ||= Set.new) << member_klass

  associate_member_class(member_klass)

  member_klass
end