Sha256: 2c701334b92b7852257a7e000379e91304281c26f92cffc38cfc32f474f1c673

Contents?: true

Size: 1.63 KB

Versions: 9

Compression:

Stored size: 1.63 KB

Contents

module FlattenRecord
  module Meta
    class AssociatedAttr < NormalizedAttr
      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

      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

      def foreign_key
        @association.foreign_key
      end
     
      def nullify(to_record)
        children.each do |child|
          child.nullify(to_record)
        end
        to_record
      end
      
      protected
      def options
        @association.options
      end
    
      private
      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

      def duplicate(to_record)
        if to_record.respond_to?(:each)
          to_record.map{|r| duplicate(r)}
        else
          to_record.dup
        end
      end

    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
flatten_record-1.0.11 lib/flatten_record/meta/associated_attr.rb
flatten_record-1.0.10 lib/flatten_record/meta/associated_attr.rb
flatten_record-1.0.9 lib/flatten_record/meta/associated_attr.rb
flatten_record-1.0.7 lib/flatten_record/meta/associated_attr.rb
flatten_record-1.0.6 lib/flatten_record/meta/associated_attr.rb
flatten_record-1.0.5 lib/flatten_record/meta/associated_attr.rb
flatten_record-1.0.4 lib/flatten_record/meta/associated_attr.rb
flatten_record-1.0.3 lib/flatten_record/meta/associated_attr.rb
flatten_record-1.0.2 lib/flatten_record/meta/associated_attr.rb