Method: MassRecord::Actions#mass_insert

Defined in:
lib/mass_record.rb

#mass_insert(hashes, into: nil) ⇒ Object



667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
# File 'lib/mass_record.rb', line 667

def mass_insert hashes, into:nil
	begin
		return false if hashes.blank? or into.blank?

		# create an array of single insert queries
		model = get_model from:into
		concentrated_queries = {}

		logger.debug "#{into}: Parsing #{hashes.count} hashes into a single query>".black.on_white
		hashes.each do |hash|
			logger << ".".black.on_white if logger.debug?
			original_key_set = hash.keys.sort
			sql = sql_for_insert hash, into:model

			# group the queries by unique column lists
			into_clause = sql.gsub /\s*VALUES.*$/,''
			value_clause = sql.gsub(/^.*VALUES\s*/,'')
			
			concentrated_queries[original_key_set] = {} unless concentrated_queries[original_key_set].is_a? Hash
			concentrated_queries[original_key_set][:into] = into_clause
			concentrated_queries[original_key_set][:values] = [] unless concentrated_queries[original_key_set][:values].is_a? Array
			concentrated_queries[original_key_set][:values] << value_clause
		end

		errors = {}

		# reparse the queries and execute them
		concentrated_queries.each do |column_set,clauses|
			final_query = "#{clauses[:into]} VALUES #{clauses[:values].join(", ")}"
			begin
				# puts "press enter to continue...:"	if Rails.env = 'development' and defined?(Rails::Console) and logger.debug?
				# gets								if Rails.env = 'development' and defined?(Rails::Console) and logger.debug?
				query final_query, connection:model
				self.mass_count += 1
			rescue Exception => e
				logger.debug e.message
				logger.info e.message.to_s[0..1000]
				errors[column_set] = e
			end
		end
		return errors
	rescue Exception => e
		logger.error e.message
		return (defined? errors) ? (errors.merge!({run_time:e})) : {run_time:e}
	end
end