jphenow/m2m_fast_insert

View on GitHub
lib/m2m_fast_insert/base.rb

Summary

Maintainability
A
35 mins
Test Coverage
module M2MFastInsert
  class Base
    attr_reader :ids, :options, :id, :join_table, :join_column_name, :table_name

    def initialize(id, join_column_name, table_name, join_table, *args)
      @options = args[1].present? ? args[1] : {}
      @id = id.to_i
      @ids = args[0].collect(&:to_i)
      @ids.uniq! if options[:unique]
      raise ArgumentError, "Can't have nil ID, perhaps you didn't save the record first?" if id.nil?
      @join_table = join_table
      @join_column_name = join_column_name
      @table_name = table_name
    end

    def inserts
      @inserts ||= begin inserts = []
                     ids.each do |given_id|
                       inserts << "(#{id}, #{given_id})"
                     end
                     inserts.join ", "
                   end
    end

    def sql
      "INSERT INTO #{join_table} (`#{table_name}_id`, `#{join_column_name}_id`) VALUES #{inserts}"
    end

    def fast_insert
      ActiveRecord::Base.connection.execute(sql) unless ids.empty?
    end
  end
end