class FlattenRecord::Meta::AssociatedAttr

Public Class Methods

new(parent, association, association_klass, model) click to toggle source
Calls superclass method
# File lib/flatten_record/meta/associated_attr.rb, line 4
def initialize(parent, association, association_klass, model)
  super(parent, association_klass, model)
  @association = Struct.
    new(:foreign_key, :name, :options).
    new(association.foreign_key, association.name, association.options) 
end

Public Instance Methods

denormalize(instance, to_record) click to toggle source
# File lib/flatten_record/meta/associated_attr.rb, line 11
def denormalize(instance, to_record)
  normal_s = instance.send(@association.name) 
  return nullify(to_record) if normal_s.blank?

  if normal_s.respond_to?(:find_each)
    to_record = multiply_and_denormalize(normal_s, to_record)
  else
    to_record = denormalize_children(normal_s, to_record)
    to_record = [to_record]
  end
  to_record.flatten
end
foreign_key() click to toggle source
# File lib/flatten_record/meta/associated_attr.rb, line 24
def foreign_key
  @association.foreign_key
end
nullify(to_record) click to toggle source
# File lib/flatten_record/meta/associated_attr.rb, line 28
def nullify(to_record)
  children.each do |child|
    child.nullify(to_record)
  end
  to_record
end

Protected Instance Methods

options() click to toggle source
# File lib/flatten_record/meta/associated_attr.rb, line 36
def options
  @association.options
end

Private Instance Methods

duplicate(to_record) click to toggle source
# File lib/flatten_record/meta/associated_attr.rb, line 55
def duplicate(to_record)
  if to_record.respond_to?(:each)
    to_record.map{|r| duplicate(r)}
  else
    to_record.dup
  end
end
multiply_and_denormalize(records, to_record) click to toggle source
# File lib/flatten_record/meta/associated_attr.rb, line 41
def multiply_and_denormalize(records, to_record)
  new_records = []
  index = 0
  records.find_each do |record|
    new_records.push (
      index == 0 ?
        denormalize_children(record, to_record) :
        denormalize_children(record, duplicate(to_record)) 
    )
    index += 1
  end
  new_records
end