Class: ActiveRecord::Associations::CollectionAssociation

Inherits:
Object
  • Object
show all
Defined in:
lib/activerecord-import/import.rb

Instance Method Summary collapse

Instance Method Details

#import(*args, &block) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/activerecord-import/import.rb', line 34

def import(*args, &block)
  unless owner.persisted?
    raise ActiveRecord::RecordNotSaved, "You cannot call import unless the parent is saved"
  end

  options = args.last.is_a?(Hash) ? args.pop : {}

  model_klass = reflection.klass
  symbolized_foreign_key = reflection.foreign_key.to_sym
  symbolized_column_names = model_klass.column_names.map(&:to_sym)

  owner_primary_key = owner.class.primary_key
  owner_primary_key_value = owner.send(owner_primary_key)

  # assume array of model objects
  if args.last.is_a?( Array ) && args.last.first.is_a?(ActiveRecord::Base)
    if args.length == 2
      models = args.last
      column_names = args.first
    else
      models = args.first
      column_names = symbolized_column_names
    end

    unless symbolized_column_names.include?(symbolized_foreign_key)
      column_names << symbolized_foreign_key
    end

    models.each do |m|
      m.public_send "#{symbolized_foreign_key}=", owner_primary_key_value
      m.public_send "#{reflection.type}=", owner.class.name if reflection.type
    end

    return model_klass.import column_names, models, options

  # supports empty array
  elsif args.last.is_a?( Array ) && args.last.empty?
    return ActiveRecord::Import::Result.new([], 0, [])

  # supports 2-element array and array
  elsif args.size == 2 && args.first.is_a?( Array ) && args.last.is_a?( Array )
    column_names, array_of_attributes = args
    symbolized_column_names = column_names.map(&:to_s)

    if symbolized_column_names.include?(symbolized_foreign_key)
      index = symbolized_column_names.index(symbolized_foreign_key)
      array_of_attributes.each { |attrs| attrs[index] = owner_primary_key_value }
    else
      column_names << symbolized_foreign_key
      array_of_attributes.each { |attrs| attrs << owner_primary_key_value }
    end

    if reflection.type
      column_names << reflection.type
      array_of_attributes.each { |attrs| attrs << owner.class.name }
    end

    return model_klass.import column_names, array_of_attributes, options
  else
    raise ArgumentError, "Invalid arguments!"
  end
end