module AssociatedScope::ParentClassMethods1

Public Instance Methods

associated_methods(&block) click to toggle source
# File lib/associated_scope.rb, line 89
def associated_methods(&block)
  @associated_methods = block
end
associated_scope(name, scope, source:) click to toggle source
# File lib/associated_scope.rb, line 85
def associated_scope(name, scope, source:)
  associated_scope_args[name] = { scope: scope, source: source }
end
associated_scope1(name, scope, source:) click to toggle source
# File lib/associated_scope.rb, line 93
def associated_scope1(name, scope, source:)
  reflection = _reflect_on_association(source)
  raise AssociationNotFoundError.new(self, source) unless reflection

  reflection = reflection.dup
  parent_scope = reflection.scope
  myscope = proc { instance_exec(&parent_scope).merge!(instance_exec(&scope)) }
  reflection.define_singleton_method(:name) do
    name
  end
  reflection.define_singleton_method(:scope) do
    myscope
  end

  associated_scope_args[name] = { scope: scope, reflection: reflection }
  define_method(name) do
    association(name).reader
  end
end
associated_scope_args() click to toggle source
# File lib/associated_scope.rb, line 81
def associated_scope_args
  @associated_scope_args ||= {}
end
extended(base) click to toggle source
Calls superclass method
# File lib/associated_scope.rb, line 23
def extended(base)
  klass = base.respond_to?(:klass) ? base.klass : base.class
  associated_scope_args2 = associated_scope_args
  associated_scope_args.each do |name, args|
    source = args[:source]
    reflection = klass._reflect_on_association(source)
    raise AssociationNotFoundError.new(self, source) unless reflection

    reflection = reflection.dup
    parent_scope = reflection.scope
    associated_scope_arg = args[:scope]
    myscope = proc do
      instance_exec(&parent_scope).merge!(instance_exec(&associated_scope_arg))
    end
    reflection.define_singleton_method(:name) do
      name
    end
    reflection.define_singleton_method(:scope) do
      myscope
    end

    associated_scope_args[name].merge! reflection: reflection
  end

  associated_methods = @associated_methods
  myblock = proc do |record|
    record.define_singleton_method(:association) do |name|
      association = association_instance_get(name)
      return association unless association.nil?

      args = associated_scope_args2[name]
      return super(name) unless args

      reflection = args[:reflection]
      association = reflection.association_class.new(self, reflection)

      association_instance_set(name, association)
      association.association_scope
      association
    end

    associated_scope_args2.keys.each do |name|
      record.define_singleton_method(name) do
        association(name).reader
      end
    end

    record.instance_eval(&associated_methods)
  end

  if base.is_a?(ActiveRecord::Base)
    myblock.call(base)
  else
    base.extend RelationExtension
    base.define_singleton_method(:myblock) { myblock }
  end
end