Sha256: 1e9b009d86e9a17d51740d9de0c945a0fe09e2e5b7213d0757b3610b999e4653

Contents?: true

Size: 1.42 KB

Versions: 4

Compression:

Stored size: 1.42 KB

Contents

module Protector
  module Adapters
    module ActiveRecord
      # Patches `ActiveRecord::Associations::Preloader`
      module Preloader extend ActiveSupport::Concern

        # Patches `ActiveRecord::Associations::Preloader::Association`
        module Association extend ActiveSupport::Concern
          included do
            # AR 4 has renamed `scoped` to `scope`
            if method_defined?(:scope)
              alias_method_chain :scope, :protector
            else
              alias_method "scope_without_protector", "scoped"
              alias_method "scoped", "scope_with_protector"
            end
          end

          # Gets current subject of preloading association
          def protector_subject
            # Owners are always loaded from the single source
            # having same protector_subject
            owners.first.protector_subject
          end

          def protector_subject?
            owners.first.protector_subject?
          end

          # Restricts preloading association scope with subject of the owner
          def scope_with_protector(*args)
            return scope_without_protector unless protector_subject?

            @meta ||= klass.protector_meta.evaluate(
              Protector::Adapters::ActiveRecord,
              klass,
              protector_subject
            )

            scope_without_protector.merge(@meta.relation)
          end
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
protector-0.5.2 lib/protector/adapters/active_record/preloader.rb
protector-0.5.1 lib/protector/adapters/active_record/preloader.rb
protector-0.4.1 lib/protector/adapters/active_record/preloader.rb
protector-0.4.0 lib/protector/adapters/active_record/preloader.rb