Sha256: 29609093dce3036799438c58da2c2ec44bc50068270c75d2159441da279c5f62

Contents?: true

Size: 1.84 KB

Versions: 1

Compression:

Stored size: 1.84 KB

Contents

# frozen_string_literal: true
module Monarchy
  module ActsAsHierarchy
    extend ActiveSupport::Concern

    module ClassMethods
      def acts_as_hierarchy
        extend Monarchy::ActsAsHierarchy::SupportMethods
        has_closure_tree dependent: :destroy

        has_many :members, class_name: 'Monarchy::Member', dependent: :destroy
        belongs_to :resource, polymorphic: true, dependent: :destroy

        include_scopes

        validates :resource_type, presence: true
        validates :resource_id, uniqueness: { scope: [:resource_type] }, presence: true
      end
    end

    module SupportMethods
      private

      def include_scopes
        scope :in, (lambda do |resource|
          where(monarchy_hierarchies: { parent_id: resource.hierarchy.self_and_descendant_ids })
        end)

        scope :accessible_for, (lambda do |user|
          where(id: accessible_roots(user)).union(where(id: accessible_leaves(user)))
        end)
      end

      def accessible_roots(user)
        joins('INNER JOIN "monarchy_hierarchy_hierarchies" ON '\
          '"monarchy_hierarchies"."id" = "monarchy_hierarchy_hierarchies"."ancestor_id"')
          .joins('INNER JOIN "monarchy_members" ON '\
          '"monarchy_members"."hierarchy_id" = "monarchy_hierarchy_hierarchies"."descendant_id"')
          .where(monarchy_members: { user_id: user.id }).distinct
      end

      def accessible_leaves(user)
        joins('INNER JOIN "monarchy_hierarchy_hierarchies" ON '\
          '"monarchy_hierarchies"."id" = "monarchy_hierarchy_hierarchies"."descendant_id"')
          .joins('INNER JOIN "monarchy_members" ON '\
          '"monarchy_members"."hierarchy_id" = "monarchy_hierarchy_hierarchies"."ancestor_id"')
          .where(monarchy_members: { user_id: user.id }).distinct
      end
    end
  end
end

ActiveRecord::Base.send :include, Monarchy::ActsAsHierarchy

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
monarchy-0.3.1 lib/monarchy/acts_as_hierarchy.rb