Sha256: cb7d93c412b9f9c47d3a8a4346a41253f765f1744b26d32eba5c20ccfeb5761f

Contents?: true

Size: 1.87 KB

Versions: 3

Compression:

Stored size: 1.87 KB

Contents

# frozen_string_literal: true

module Orthoses
  module ActiveRecord
    class Relation
      def initialize(loader)
        @loader = loader
      end

      def call
        @loader.call.tap do |store|
          ::ActiveRecord::Base.descendants.each do |klass|
            next if klass.abstract_class?

            primary_key = fetch_primary_key(klass)

            model_name = Utils.module_name(klass) or next
            class_specific_relation = "#{model_name}::ActiveRecord_Relation"
            class_specific_proxy = "#{model_name}::ActiveRecord_Associations_CollectionProxy"
            class_specific_generated_relation_methods = "#{model_name}::GeneratedRelationMethods"

            store[class_specific_generated_relation_methods].tap do |c|
            end

            store[class_specific_relation].tap do |c|
              c.header = "class #{class_specific_relation} < ::ActiveRecord::Relation"
              c << "include #{class_specific_generated_relation_methods}"
              c << "include _ActiveRecord_Relation[#{model_name}, #{primary_key}]"
              c << "include Enumerable[#{model_name}]"
            end

            store[class_specific_proxy].tap do |c|
              c.header = "class #{class_specific_proxy} < ::ActiveRecord::Associations::CollectionProxy"
              c << "include _ActiveRecord_Relation[#{model_name}, #{primary_key}]"
            end

            store[model_name].tap do |c|
              c << "extend _ActiveRecord_Relation_ClassMethods[#{model_name}, #{class_specific_relation}, #{primary_key}]"
            end
          end
        end
      end

      private

      def fetch_primary_key(klass)
        type = klass.type_for_attribute(klass.primary_key).type
        ActiveRecord.sql_type_to_rbs(type)
      rescue ::ActiveRecord::StatementInvalid => e
        Orthoses.logger.warn(e.to_s)
        "untyped"
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
orthoses-rails-1.2.0 lib/orthoses/active_record/relation.rb
orthoses-rails-1.1.0 lib/orthoses/active_record/relation.rb
orthoses-rails-1.0.0 lib/orthoses/active_record/relation.rb