module Monarchy::ActsAsHierarchy::SupportMethods
Public Instance Methods
accessible_for_options(options = {})
click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 90 def accessible_for_options(options = {}) Monarchy.configuration.accessible_for_options.to_h.merge(options) end
accessible_leaves_ids(user_id, inherited_roles = [])
click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 84 def accessible_leaves_ids(user_id, inherited_roles = []) ancestor_leaves_for_user(user_id, false) .select('monarchy_hierarchy_hierarchies.ancestor_id AS id') .union_all(descendant_leaves_for_user(user_id, inherited_roles)).select(:id) end
accessible_roots_ids(user_id, parent_access)
click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 72 def accessible_roots_ids(user_id, parent_access) user_query = sanitize_sql_for_assignment(['INNER JOIN (SELECT hierarchy_id FROM monarchy_members ' \ 'WHERE monarchy_members.user_id = ?) as members ON ' \ 'members.hierarchy_id = monarchy_hierarchy_hierarchies.descendant_id', user_id]) accessible_roots = unscoped.joins('INNER JOIN monarchy_hierarchy_hierarchies ON ' \ 'monarchy_hierarchies.id = monarchy_hierarchy_hierarchies.ancestor_id') .joins(user_query).select(:id) parent_access ? roots_with_children(accessible_roots) : accessible_roots end
Private Instance Methods
ancestor_leaves_for_user(user_id, inherited, inherited_roles = [])
click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 135 def ancestor_leaves_for_user(user_id, inherited, inherited_roles = []) user_query = sanitize_sql_for_assignment(['INNER JOIN (SELECT id, hierarchy_id FROM monarchy_members WHERE ' \ 'user_id = ?) as monarchy_members ON monarchy_members.hierarchy_id = monarchy_hierarchies.id', user_id]) unscoped .joins('INNER JOIN monarchy_hierarchy_hierarchies ON ' \ 'monarchy_hierarchies.id = monarchy_hierarchy_hierarchies.descendant_id') .joins(user_query) .joins('INNER JOIN monarchy_members_roles ON monarchy_members_roles.member_id = monarchy_members.id') .joins("INNER JOIN (#{inheritance_query(inherited_roles, inherited)}) as " \ 'monarchy_roles ON monarchy_members_roles.role_id = monarchy_roles.id') end
descendant_leaves_for_user(user_id, inherited_roles = [])
click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 128 def descendant_leaves_for_user(user_id, inherited_roles = []) ancestor_leaves_for_user(user_id, true, inherited_roles) .joins('INNER JOIN monarchy_hierarchy_hierarchies AS monarchy_descendants ON ' \ 'monarchy_descendants.ancestor_id = monarchy_hierarchies.id') .select('monarchy_descendants.descendant_id AS id') end
include_relations()
click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 96 def include_relations belongs_to :resource, polymorphic: true has_many :members, class_name: "::#{Monarchy.member_class}", dependent: :destroy has_many :users, through: :members, class_name: "::#{Monarchy.user_class}" end
include_scopes()
click to toggle source
rubocop:disable all
# File lib/monarchy/acts_as_hierarchy.rb, line 108 def include_scopes scope :in, (lambda do |hierarchy, descendants = true| where(id: descendants ? descendants_for(hierarchy) : children_for(hierarchy)) end) scope :accessible_for, (lambda do |user, options = {}| user_id = user.id custom_options = accessible_for_options(options) where(id: accessible_roots_ids(user_id, custom_options[:parent_access]) .union_all(accessible_leaves_ids(user_id, custom_options[:inherited_roles]))) end) end
include_validators()
click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 102 def include_validators validates :resource_type, presence: true validates :resource_id, uniqueness: { scope: [:resource_type] }, presence: true end
inheritance_query(inherited_roles, inherited)
click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 148 def inheritance_query(inherited_roles, inherited) if inherited_roles.present? Monarchy.role_class.select(:id, :inherited, :name) .where('inherited = ? OR name IN (?)', inherited, inherited_roles).to_sql else Monarchy.role_class.select(:id, :inherited).where(inherited: inherited).to_sql end end
roots_with_children(accessible_roots)
click to toggle source
rubocop:enable all
# File lib/monarchy/acts_as_hierarchy.rb, line 123 def roots_with_children(accessible_roots) accessible_children = unscoped.where(parent_id: accessible_roots).select(:id) accessible_roots.union_all(accessible_children) end