HEX
Server: Apache
System: Windows NT MAGNETO-ARM 10.0 build 22000 (Windows 10) AMD64
User: Michel (0)
PHP: 7.4.7
Disabled: NONE
Upload Files
File: C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/activeresource-6.0.0/lib/active_resource/reflection.rb
# frozen_string_literal: true

require "active_support/core_ext/class/attribute"
require "active_support/core_ext/module/deprecation"

module ActiveResource
  # = Active Resource reflection
  #
  # Associations in ActiveResource would be used to resolve nested attributes
  # in a response with correct classes.
  # Now they could be specified over Associations with the options :class_name
  module Reflection # :nodoc:
    extend ActiveSupport::Concern

    included do
      class_attribute :reflections
      self.reflections = {}
    end

    module ClassMethods
      def create_reflection(macro, name, options)
        reflection = AssociationReflection.new(macro, name, options)
        self.reflections = self.reflections.merge(name => reflection)
        reflection
      end
    end


    class AssociationReflection
      def initialize(macro, name, options)
        @macro, @name, @options = macro, name, options
      end

      # Returns the name of the macro.
      #
      # <tt>has_many :clients</tt> returns <tt>:clients</tt>
      attr_reader :name

      # Returns the macro type.
      #
      # <tt>has_many :clients</tt> returns <tt>:has_many</tt>
      attr_reader :macro

      # Returns the hash of options used for the macro.
      #
      # <tt>has_many :clients</tt> returns +{}+
      attr_reader :options

      # Returns the class for the macro.
      #
      # <tt>has_many :clients</tt> returns the Client class
      def klass
        @klass ||= class_name.constantize
      end

      # Returns the class name for the macro.
      #
      # <tt>has_many :clients</tt> returns <tt>'Client'</tt>
      def class_name
        @class_name ||= derive_class_name
      end

      # Returns the foreign_key for the macro.
      def foreign_key
        @foreign_key ||= derive_foreign_key
      end

      private
        def derive_class_name
          options[:class_name] ? options[:class_name].to_s.camelize : name.to_s.classify
        end

        def derive_foreign_key
          options[:foreign_key] ? options[:foreign_key].to_s : "#{name.to_s.downcase}_id"
        end
    end
  end
end