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)
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
elsif args.last.is_a?( Array ) && args.last.empty?
return ActiveRecord::Import::Result.new([], 0, [])
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
|