Sha256: fdd68e6c14de67ee4ca16c025439b44d39ebde186c5398b6d5aab11895247f19

Contents?: true

Size: 1.61 KB

Versions: 5

Compression:

Stored size: 1.61 KB

Contents

module GreyscaleRecord
  module Associations
    class Base

      attr_accessor :name, :opts, :key

      def initialize( base_class, name, opts = {} )
        self.name = name
        self.opts = opts
        self.key  = idify base_class

        sanitize_opts( base_class )
      end

      def klass( instance = nil )
        @klass ||= association_class name, opts
      end

      protected

      def association_class( name, opts = {} )
        a_class       = opts[:class]                   if opts.has_key? :class
        a_class_name  = opts[:class_name].constantize  if opts.has_key? :class_name

        a_class || a_class_name || derived_class_for( name )
      end

      def derived_class_for( name )
        name.to_s.singularize.classify.constantize
      end

      def idify( class_name )
        "#{class_name.to_s.demodulize.underscore}_id"
      end

      def supported_options
        [ :class, :class_name ] + additional_options
      end

      def sanitize_opts( base_class )
        if name.to_s == "object"
          raise GreyscaleRecord::Errors::AssociationError, "#{base_class}: 'object_id' is a reserved keyword in ruby and cannot be overridden"
        end
        invalid_options = (opts.keys - supported_options)
        if invalid_options.present?
          list = invalid_options.map{|o|"'#{o}'"}.to_sentence
          plural = invalid_options.count > 1
          raise GreyscaleRecord::Errors::AssociationError, "#{base_class}: #{list} #{plural ? "are" : "is"} not supported. Please see README for full details: http://www.github.com/greyscale-io/greyscale_record"
        end
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
greyscale_record-1.0.3 lib/greyscale_record/associations/base.rb
greyscale_record-1.0.2 lib/greyscale_record/associations/base.rb
greyscale_record-1.0.1 lib/greyscale_record/associations/base.rb
greyscale_record-1.0.0 lib/greyscale_record/associations/base.rb
greyscale_record-0.0.1 lib/greyscale_record/associations/base.rb