Có một reset_pk_sequences!
trên Bộ điều hợp Postgres . Bạn có thể gọi nó và nó sẽ đặt nó thành max (id) + 1, có thể là những gì bạn muốn.
Trong một số dự án, tôi nhận được dữ liệu ETL thường xuyên, đủ để đảm bảo một nhiệm vụ cào để thực hiện điều này cho tất cả các mô hình hoặc cho một mô hình cụ thể. Đây là nhiệm vụ - bao gồm nó trong một số Rakefile hoặc trong chính nó dưới lib / task:
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
Giờ đây, bạn có thể chạy điều này cho tất cả các kiểu máy (được định nghĩa trong RAIS_ROOT / app / models) bằng cách sử dụng rake reset_sequences
hoặc cho một mô hình cụ thể bằng cách chuyển vào một tên lớp.