Sha256: c537ee9f6d121a211742c40c49b16840e8e018ff00967a3cb5bd6c4d5dc19177

Contents?: true

Size: 1.11 KB

Versions: 5

Compression:

Stored size: 1.11 KB

Contents

require 'active_record'

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 :postgresql
      self.connection.execute(postgresql_bulk_insert_sql(record_list))      
    else
      self.default_bulk_insert(record_list)
    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.default_bulk_insert(record_list)
    ActiveRecord::Base.transaction do
      record_list.each{|record| Notifiable::NotificationStatus.create(record) }
    end
  end
  
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
notifiable-rails-0.30.4 lib/notifiable/active_record.rb
notifiable-rails-0.30.3 lib/notifiable/active_record.rb
notifiable-rails-0.30.2 lib/notifiable/active_record.rb
notifiable-rails-0.30.1 lib/notifiable/active_record.rb
notifiable-rails-0.30.0 lib/notifiable/active_record.rb