Há um
reset_pk_sequences!
no adaptador Postgres . Você pode chamá-lo e ele o definirá como max(id) + 1, que é provavelmente o que você deseja. Em alguns projetos, recebo dados ETL com frequência suficiente para garantir uma tarefa de rake para fazer isso para todos os modelos ou para um modelo especificado. Aqui está a tarefa - inclua-a em algum Rakefile ou em seu próprio em lib/tasks:
desc "Reset all sequences. Run after data imports"
task :reset_sequences, :model_class, :needs => :environment do |t, args|
if args[:model_class]
classes = Array(eval args[:model_class])
else
puts "using all defined active_record models"
classes = []
Dir.glob(RAILS_ROOT + '/app/models/**/*.rb').each { |file| require file }
Object.subclasses_of(ActiveRecord::Base).select { |c|
c.base_class == c}.sort_by(&:name).each do |klass|
classes << klass
end
end
classes.each do |klass|
next if klass == CGI::Session::ActiveRecordStore::Session && ActionController::Base.session_store.to_s !~ /ActiveRecordStore/
puts "reseting sequence on #{klass.table_name}"
ActiveRecord::Base.connection.reset_pk_sequence!(klass.table_name)
end
end
Agora você pode executar isso para todos os modelos (definidos em RAIS_ROOT/app/models) usando
rake reset_sequences
, ou para um modelo específico passando um nome de classe.