重置rails中的主键ID

时间:2010-12-28 07:37:44

标签: ruby-on-rails ruby-on-rails-3

当我从表中delete_all并再次开始插入时,我遇到主键如何增加的问题。这是有问题的,因为我有其他模型与清除表相关联。例如,如果我拥有属于计算机的Apple,那么当我清除计算机表并重新添加计算机时,关联就会搞乱,因为Apple现在在其行中有婴儿computer_id。我希望能够重置计算机的主键,以便在重新添加计算机时,关联仍然保持不变。我应该如何在铁轨中这样做?

修改 我很抱歉没有明白这一点,但现在我会告诉你我想做什么。我希望用户与机器(计算机)相关联。计算机有自己的ID,只能由管理员创建。计算机桌上有一定数量的计算机。

User
belongs_to :computer

Computer
has_many :users

我面临的问题是,我将计算机表预装在seeds.rb / rakefile中。当我启动我的应用程序时,我想只运行首先删除所有内容然后预加载表的文件。这将允许用户仅从计算机表中提供的计算机中选择计算机。我希望能够再次运行此脚本(例如在heroku控制台中,而不删除User表),并且仍然获得与每台计算机相关联的相同ID(因此也与每个用户相关)。我对如何做到这一点很困惑。如果我不应该这样做,请告诉我。

3 个答案:

答案 0 :(得分:11)

首先,你不应该这样做!如果要更改记录,则只需更新表中的行。不要删除它并重新插入!如果您仍想这样做,那么您应该删除其他表中的所有关联行并插入计算机和苹果。

我不知道Rails重置自动增量主键的方法,但是如果你使用mysql则可以运行自定义查询:

ActiveRecord::Base.connection.execute('ALTER TABLE tablename AUTO_INCREMENT = 1')

它应该将自动增量值重置为下一个可用数字。

编辑:

如何使用id加载数据。 我不确定加载种子是否可以做到,但是肯定使用固定装置可以提供帮助。您需要的是使用数据准备computers.yml文件:

First_computer:
  id: 1
  name: computer

Second_computer:
  id: 2
  name: dell

然后您可以使用它将其加载到db:

require 'active_record/fixtures'

Fixtures.create_fixtures("/path/to/directory/where/your/yml/file/is/", "computers")

但它会重置整个表格(所有行都会被删除并重新插入 - 但你可以保留你的ID)。

我再次警告你,以这种方式加载数据是个坏主意。夹具/种子应仅用于使用初始(需要启动应用程序)数据为您的数据库播种。

为什么要重置此表?

答案 1 :(得分:2)

这是一种奇怪的处理方式,但如果您需要删除并替换关联表中的键,则可以尝试指定:dependent => :nullify,它会保留关联的行并在删除时将外键设置为NULL :

class Computer
  has_many :apples, :dependent => :nullify
end

class Apple
  belongs_to :computer
end

c = Computer.find(some_id)
apples = c.apples
c.destroy # sets each foreign key in apples to NULL
new_c = Computer.create
new_c.apples = apples # sets each foreign key to new_c.id

答案 2 :(得分:1)

您不应该依赖重置主键来维护关系,这不是正确的方法。如果您发现自己必须删除源表,同时仍然保持将来的关系,请使用不同的键进行映射,例如,您可以在计算机表中使用代码字段,然后使用它来构建关系。您为relationships指定了foreign_key。