我根据hgimenez的答案和this other one给出了一个解决方案.
因为我通常使用Sqlite或PostgreSQL,所以我只为它们开发;但将其扩展到MySQL,应该不会太麻烦.
将其放入lib/中,并在初始值设定项上要求它:
# lib/active_record/add_reset_pk_sequence_to_base.rb
module ActiveRecord
class Base
def self.reset_pk_sequence
case ActiveRecord::Base.connection.adapter_name
when 'SQLite'
new_max = maximum(primary_key) || 0
update_seq_sql = "update sqlite_sequence set seq = #{new_max} where name = '#{table_name}';"
ActiveRecord::Base.connection.execute(update_seq_sql)
when 'PostgreSQL'
ActiveRecord::Base.connection.reset_pk_sequence!(table_name)
else
raise "Task not implemented for this DB adapter"
end
end
end
end
用法:
Client.count # 10
Client.destroy_all
Client.reset_pk_sequence
Client.create(:name => 'Peter') # this client will have id=1
编辑:因为最常见的情况是在清除数据库表之后,所以我建议查看database_cleaner.它自动处理ID重置.您可以告诉它只删除选定的表,如下所示:
DatabaseCleaner.clean_with(:truncation, :only => %w[clients employees])