Sha256: a704795bcb18674859f7ac595376208ee2de2ca6d2b1cdc1ef6a2a7049b48759

Contents?: true

Size: 1.54 KB

Versions: 4

Compression:

Stored size: 1.54 KB

Contents

class ActiveRecord::AssociatedObject
  class << self
    def inherited(klass)
      record_klass   = klass.module_parent
      record_name    = klass.module_parent_name.demodulize.underscore
      attribute_name = klass.to_s.demodulize.underscore.to_sym

      unless record_klass.respond_to?(:descends_from_active_record?) && record_klass.descends_from_active_record?
        raise ArgumentError, "#{record_klass} isn't valid; can only associate with ActiveRecord::Base subclasses"
      end

      klass.alias_method record_name, :record
      klass.define_singleton_method(:record_klass)   { record_klass }
      klass.define_singleton_method(:attribute_name) { attribute_name }
      klass.delegate :record_klass, :attribute_name, to: :class
    end

    def extension(&block)
      record_klass.class_eval(&block)
    end

    def respond_to_missing?(...) = record_klass.respond_to?(...) || super
    delegate :unscoped, :transaction, :primary_key, to: :record_klass

    def method_missing(method, ...)
      if !record_klass.respond_to?(method) then super else
        record_klass.public_send(method, ...).then do |value|
          value.respond_to?(:each) ? value.map(&attribute_name) : value&.public_send(attribute_name)
        end
      end
    end
  end

  attr_reader :record
  delegate :id, :transaction, to: :record

  def initialize(record)
    @record = record
  end

  def ==(other)
    other.is_a?(self.class) && id == other.id
  end
end

require_relative "associated_object/version"
require_relative "associated_object/railtie" if defined?(Rails::Railtie)

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
active_record-associated_object-0.8.3 lib/active_record/associated_object.rb
active_record-associated_object-0.8.2 lib/active_record/associated_object.rb
active_record-associated_object-0.7.1 lib/active_record/associated_object.rb
active_record-associated_object-0.7.0 lib/active_record/associated_object.rb