class NestedRecord::Setup

Attributes

name[R]
primary_key[R]
reject_if_proc[R]

Public Class Methods

new(owner, name, **options, &block) click to toggle source
# File lib/nested_record/setup.rb, line 6
def initialize(owner, name, **options, &block)
  @options = options
  @owner = owner
  @name = name

  setup_association_attribute
  setup_record_class(&block)
  setup_attributes_writer_opts
  setup_methods_extension
end

Public Instance Methods

attributes_writer_strategy() click to toggle source
# File lib/nested_record/setup.rb, line 36
def attributes_writer_strategy
  return unless @options.fetch(:attributes_writer) { true }

  case (strategy = @attributes_writer_opts.fetch(:strategy) { :upsert })
  when :rewrite, :upsert
    return strategy
  else
    raise NestedRecord::ConfigurationError, "Unknown strategy #{strategy.inspect}"
  end
end
primary_check(type) click to toggle source
# File lib/nested_record/setup.rb, line 47
def primary_check(type)
  if (pkey_attributes = primary_key)
    klass = record_class
  else
    klass = record_class.find_subtype(type)
    while !(pkey_attributes = klass.primary_key) && (klass < NestedRecord::Base)
      klass = klass.superclass
    end
  end
  # TODO: cache this
  NestedRecord::PrimaryKeyCheck.new(klass, pkey_attributes) if pkey_attributes
end
record_class() click to toggle source
# File lib/nested_record/setup.rb, line 17
def record_class
  if @record_class.is_a? String
    @record_class = NestedRecord.lookup_const(@owner, @record_class)
  end
  @record_class
end

Private Instance Methods

define_local_record_class(&block) click to toggle source
# File lib/nested_record/setup.rb, line 74
def define_local_record_class(&block)
  case (cn = @options.fetch(:class_name) { false })
  when true
    class_name = infer_record_class_name
  when false
    class_name = nil
  when String, Symbol
    class_name = cn.to_s
  else
    raise NestedRecord::ConfigurationError, "Bad :class_name option #{cn.inspect}"
  end
  @record_class = Class.new(NestedRecord::Base, &block)
  @owner.const_set(class_name, @record_class) if class_name
end
infer_record_class_name() click to toggle source
# File lib/nested_record/setup.rb, line 102
def infer_record_class_name
  cn = name.to_s.camelize
  cn = cn.singularize if self.is_a?(HasMany)
  cn
end
methods_extension_module_name() click to toggle source
# File lib/nested_record/setup.rb, line 129
def methods_extension_module_name
  @methods_extension_module_name ||= :"NestedRecord_#{self.class.name.demodulize}_#{name.to_s.camelize}"
end
setup_association_attribute() click to toggle source
# File lib/nested_record/setup.rb, line 62
def setup_association_attribute
  @owner.attribute name, type, default: default_value
end
setup_attributes_writer_opts() click to toggle source
# File lib/nested_record/setup.rb, line 108
def setup_attributes_writer_opts
  case (aw = @options.fetch(:attributes_writer) { {} })
  when Hash
    @attributes_writer_opts = aw
  when true, false
    @attributes_writer_opts = {}
  when Symbol
    @attributes_writer_opts = { strategy: aw }
  else
    raise NestedRecord::ConfigurationError, "Bad :attributes_writer option #{aw.inspect}"
  end
  @reject_if_proc = @attributes_writer_opts[:reject_if]
end
setup_methods_extension() click to toggle source
# File lib/nested_record/setup.rb, line 122
def setup_methods_extension
  methods_extension = build_methods_extension
  @owner.include methods_extension
  @owner.const_set methods_extension_module_name, methods_extension
  @owner.validate methods_extension.validation_method_name
end
setup_record_class(&block) click to toggle source
# File lib/nested_record/setup.rb, line 66
def setup_record_class(&block)
  if block
    define_local_record_class(&block)
  else
    link_existing_record_class
  end
end