module Monarchy::ActsAsHierarchy::ClassMethods

Public Instance Methods

acts_as_hierarchy() click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 8
def acts_as_hierarchy
  extend Monarchy::ActsAsHierarchy::SupportMethods
  self.table_name = 'monarchy_hierarchies'
  has_closure_tree dependent: :destroy

  include_relations
  include_scopes
  include_validators

  extend Monarchy::ActsAsHierarchy::ClassMethods
  include Monarchy::ActsAsHierarchy::InstanceMethods
end
ancestors_for(hierarchies) click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 53
def ancestors_for(hierarchies)
  check_argument_type(hierarchies)
  return none unless hierarchies

  unscoped.joins('INNER JOIN monarchy_hierarchy_hierarchies ON '\
                 'monarchy_hierarchies.id = monarchy_hierarchy_hierarchies.ancestor_id')
          .where(monarchy_hierarchy_hierarchies: { descendant_id: hierarchies.select(:id) })
          .where('monarchy_hierarchy_hierarchies.generations > 0')
end
children_for(hierarchies) click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 34
def children_for(hierarchies)
  check_argument_type(hierarchies)
  hierarchies ? unscoped.where(parent: hierarchies) : none
end
descendants_for(hierarchies) click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 48
def descendants_for(hierarchies)
  check_argument_type(hierarchies)
  hierarchies ? unscoped.with_ancestor(hierarchies) : none
end
hierarchies_for(resources) click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 29
def hierarchies_for(resources)
  check_argument_type(resources)
  resources ? unscoped.where(resource: resources) : none
end
parents_for(hierarchies) click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 39
def parents_for(hierarchies)
  check_argument_type(hierarchies)
  return none unless hierarchies

  unscoped.joins('INNER JOIN monarchy_hierarchies AS hierarchies_children ON '\
                 'monarchy_hierarchies.id = hierarchies_children.parent_id')
          .where(hierarchies_children: { id: hierarchies })
end

Private Instance Methods

check_argument_type(argument) click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 65
def check_argument_type(argument)
  condition = argument.nil? || argument.is_a?(ActiveRecord::Base) || argument.is_a?(ActiveRecord::Relation)
  raise(ArgumentError, 'Argument has to be ActiveRecord!') unless condition
end