class Rapids::Batch::InsertInto
Public Class Methods
new(model,batch_definition,values,options = {})
click to toggle source
# File lib/rapids/batch/insert_into.rb, line 9 def initialize(model,batch_definition,values,options = {}) @model = model @batch = batch_definition @values = values @options = options end
Public Instance Methods
to_sql()
click to toggle source
# File lib/rapids/batch/insert_into.rb, line 16 def to_sql columns_helper = ColumnsHelper.new(@model,@batch) insert_header_sql = columns_helper.map{|column,path|sql_column_name(column,path)}.join(",") values_sql = @values.map do |row| row_sql = columns_helper.map do |column,path| source_column_name = column.name destination_column = column @batch.find_or_creates.each do |find_or_create| if find_or_create.name == path.first && find_or_create.find_columns.any?{|fc|fc.is_a?(Array) && fc.first.to_s == column.name} source_column_name = find_or_create.find_columns.detect{|fc|fc.is_a?(Array) && fc.first.to_s == column.name}.last.to_s end end specific_object = path.inject(row) do |memo,hash_or_association_name| association_name = if hash_or_association_name.is_a?(Hash) hash_or_association_name[:name] else hash_or_association_name end if memo.respond_to?(association_name) memo.send(association_name) elsif memo.is_a?(Hash) && memo[association_name.to_s] memo[association_name.to_s] elsif association_name.is_a?(String) memo end end if specific_object.is_a?(Array) many_attributes = specific_object.map do |s| if s.is_a?(ActiveRecord::Base) s.instance_variable_get(:@attributes)[source_column_name] else s[source_column_name] end end.compact if many_attributes.empty? default_on_nil(nil,destination_column) else default_on_nil(many_attributes.sort.join(","),destination_column) end else val = if specific_object.is_a?(ActiveRecord::Base) specific_object.instance_variable_get(:@attributes)[source_column_name] #speeds things up a bit since it's not typed first before being quoted else specific_object[source_column_name] end default_on_nil(val,destination_column) end end "(#{row_sql.join(",")})".encode("utf-8", :undef => :replace, :replace => "") end.join(",") "INSERT INTO `#{batch_table_name}` (#{insert_header_sql}) VALUES #{values_sql}" end