在销毁所有记录之后,为什么创建的新对象的ID高于旧的最后一个记录的ID?

时间:2016-08-20 16:55:05

标签: ruby-on-rails

您好我的rails应用程序中有一个种子文件,我将销毁所有旧对象,然后创建各种新对象。我希望创建新对象的id为1,因为所有旧对象都被销毁,但是使用高于旧对象的所有id的id创建新对象。因此,举个例子,我有50个Post对象,id为1-50。我运行Post.destroy_all并创建了50个Post对象。所有旧的Post对象都被销毁,但新的Post对象都具有51-100的id。 Post.find(1)不存在。

这是我的种子文件:

Photo.destroy_all
Post.destroy_all
Like.destroy_all

50.times do 
  Photo.create(name: Faker::Name.name)
end


50.times do 
  Post.create(body: Faker::Lorem.paragraph)
end


def get_parent
  resource = [Post, Photo].sample
  parent = resource.all.sample
  parent
end


150.times do 
  parent = get_parent
  Like.create(likeable_type: parent.class.name, likeable_id: parent.id)
end

如果我多次运行rake db:seed,每次运行时每个对象集合的ID会高出50。所以当id为101 - 150并运行rake db:seed时,id现在为151-200,而且没有任何对象存在且id小于151。

如何在销毁所有记录后创建具有从1开始的ID的对象,以及为什么我会获得此当前行为?

感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

你应该在destroy命令行之后在种子文件中写这个:

ActiveRecord::Base.connection.reset_pk_sequence!('photos')

答案 1 :(得分:2)

这是您的数据库中的序列,尝试通过以下方式重置序列:

ALTER SEQUENCE photos_id_seq RESTART WITH 1;

答案 2 :(得分:2)

只需运行rake db:reset,它应该重置所有内容,并将数据库重新播种为0。

这将解决将记录恢复为0的问题,但是为什么它会这样做,这是因为当你删除数据时它的设计方式就是删除数据而不是删除它在数据库中的位置它应该做的一般。这种行为通常是件好事。

想象一下,如果您的ID为2的用户被删除或删除了他们的帐户,并且您还拥有用户1和3。您不一定要为您的下一个用户重复使用该ID:2,而是出于多种原因而宁愿给他们一个新的唯一ID。为了安全起见,他们的用户ID可能与数据库中其他位置的记录相关联。我希望这有帮助!