Method: ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#insert

Defined in:
lib/active_record/connection_adapters/postgresql_adapter.rb

#insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) ⇒ Object

Executes an INSERT query and returns the new record’s ID



482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
# File 'lib/active_record/connection_adapters/postgresql_adapter.rb', line 482

def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil)
  # Extract the table from the insert sql. Yuck.
  table = sql.split(" ", 4)[2].gsub('"', '')

  # Try an insert with 'returning id' if available (PG >= 8.2)
  if supports_insert_with_returning?
    pk, sequence_name = *pk_and_sequence_for(table) unless pk
    if pk
      id = select_value("#{sql} RETURNING #{quote_column_name(pk)}")
      clear_query_cache
      return id
    end
  end

  # Otherwise, insert then grab last_insert_id.
  if insert_id = super
    insert_id
  else
    # If neither pk nor sequence name is given, look them up.
    unless pk || sequence_name
      pk, sequence_name = *pk_and_sequence_for(table)
    end

    # If a pk is given, fallback to default sequence name.
    # Don't fetch last insert id for a table without a pk.
    if pk && sequence_name ||= default_sequence_name(table, pk)
      last_insert_id(table, sequence_name)
    end
  end
end