Er is een reset_pk_sequences!
methode op de Postgres-adapter . Je kunt het aanroepen en het zal het instellen op max(id) + 1, wat waarschijnlijk is wat je wilt.
In sommige projecten krijg ik gegevens vaak genoeg ETL'ed om een rake taak te rechtvaardigen om dit voor alle modellen of voor een bepaald model te doen. Dit is de taak - neem het op in een Rakefile of in zijn eigen onder 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
U kunt dit nu uitvoeren voor alle modellen (gedefinieerd onder RAIS_ROOT/app/modellen) met behulp van rake reset_sequences
, of voor een specifiek model door een klassenaam door te geven.