Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save mlitwiniuk/e031b6f1d50c41f45926fb577b6ae13b to your computer and use it in GitHub Desktop.

Select an option

Save mlitwiniuk/e031b6f1d50c41f45926fb577b6ae13b to your computer and use it in GitHub Desktop.

Revisions

  1. mlitwiniuk created this gist Dec 4, 2017.
    42 changes: 42 additions & 0 deletions rails_4_2_postgres_10_sequence_monkey_patch_fix.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,42 @@
    # In PostgreSQL 10 each sequence does not know `increment_by` or `min_value`
    # This fix is already in Rails master, this is just monkey patch "to make it
    # work" in Rails 4.2
    # More details here: https://github.com/rails/rails/pull/28864
    # Original issue: https://github.com/rails/rails/issues/28780
    module ActiveRecord
    module ConnectionAdapters
    module PostgreSQL
    module SchemaStatements
    # Resets the sequence of a table's primary key to the maximum value.
    def reset_pk_sequence!(table, pk = nil, sequence = nil) #:nodoc:
    unless pk && sequence
    default_pk, default_sequence = pk_and_sequence_for(table)

    pk ||= default_pk
    sequence ||= default_sequence
    end

    if @logger && pk && !sequence
    @logger.warn "#{table} has primary key #{pk} with no default sequence."
    end

    if pk && sequence
    quoted_sequence = quote_table_name(sequence)
    max_pk = select_value("select MAX(#{quote_column_name pk}) from #{quote_table_name(table)}")
    if max_pk.nil?
    if postgresql_version >= 100000
    minvalue = select_value("SELECT seqmin from pg_sequence where seqrelid = '#{quoted_sequence}'::regclass")
    else
    minvalue = select_value("SELECT min_value FROM #{quoted_sequence}")
    end
    end

    select_value(<<-end_sql, "SCHEMA")
    SELECT setval('#{quoted_sequence}', #{max_pk ? max_pk : minvalue}, #{max_pk ? true : false})
    end_sql
    end
    end
    end
    end
    end
    end