Има reset_pk_sequences!
метод на адаптера на Postgres . Можете да го извикате и той ще го настрои на max(id) + 1, което вероятно е това, което искате.
В някои проекти получавам данни ETL'ed достатъчно често, за да гарантирам рейк задача, за да направя това за всички модели или за определен модел. Ето задачата - включете я в някой Rakefile или в негов собствен под 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
Сега можете да стартирате това или за всички модели (дефинирани в RAIS_ROOT/app/models), като използвате rake reset_sequences
, или за конкретен модел чрез предаване на име на клас.