Sha256: 819c8bb3c9184bab6baba513e9c718d1f204774eb1d084f8a1bac61cf248fda0

Contents?: true

Size: 1.53 KB

Versions: 1

Compression:

Stored size: 1.53 KB

Contents

class ActiveRecord::Base

  def self.bulk_insert!(record_list)
    return if record_list.empty?
    
    adapter_type = connection.adapter_name.downcase.to_sym
    case adapter_type
    when :mysql
      raise NotImplementedError, "Not implemented type '#{adapter_type}'"
    when :sqlite
      self.create(record_list)
    when :postgresql
      self.connection.execute(postgresql_bulk_insert_sql(record_list))      
    when :oracleenhanced
      self.connection.execute(oracle_bulk_insert_sql(record_list))
    else
      raise NotImplementedError, "Unknown adapter type '#{adapter_type}' for ActiveRecord::Base.bulk_insert!"
    end
  end
  
  protected  
  def self.convert_record_list(record_list)
    key_list = record_list.map(&:keys).flatten.uniq.sort

    value_list = record_list.map do |rec|
      list = []
      key_list.each {|key| list <<  ActiveRecord::Base.connection.quote(rec[key]) }
      list
    end

    return [key_list, value_list]
  end
  
  def self.postgresql_bulk_insert_sql(record_list)
    key_list, value_list = convert_record_list(record_list)        
    "INSERT INTO #{self.table_name} (#{key_list.join(", ")}) VALUES #{value_list.map {|rec| "(#{rec.join(", ")})" }.join(" ,")}"
  end
  
  def self.oracle_bulk_insert_sql(record_list)
    key_list, value_list = convert_record_list(record_list)  
    
    inserts = []
    value_list.each do |rec|
      inserts << "INTO #{self.table_name} (#{key_list.join(", ")}) VALUES (#{rec.join(", ")})"
    end 
    
    "INSERT ALL #{inserts.join(' ')} SELECT 1 FROM DUAL;"   
  end
  
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
notifiable-rails-0.19.5 lib/notifiable/active_record.rb