从Rails控制台修改数据库ID?

时间:2009-01-13 02:10:56

标签: ruby-on-rails ruby

我有一个小型数据库,并且一直在通过Rails页面添加条目。我“摧毁”了其中一个条目,现在我的ID序列正在跳过一个。例如,我现在有42个然后是44个,而不是显而易见的:42,43,44。

我想知道是否有办法通过控制台编辑新对象的ID号。我试过了:

record.id = 43
record.save

record = record.new
record.attributes = { :id => 43 }

但两者都不起作用。我相当肯定必须有一个控制台方法,但我似乎无法在Google上找到更具体的内容,我可能错误地阅读了Rails API ...我是否可能必须通过sqlite中的直接SQL来做到这一点?

由于

3 个答案:

答案 0 :(得分:39)

最好的方法是直接执行SQL,并在序列中解决这个时间故障。

尝试访问控制台(ruby脚本/控制台)并输入:

>> sql = "update records set id=43 where id=44"
>> ActiveRecord::Base.connection.execute(sql)

其中44是新创建的对象的id,而43是你在表中缺少的那个

祝你好运!

答案 1 :(得分:23)

实际上,您可以手动为新对象设置ID:

record = Record.new
record.id = 1234
record.save

但是,您要做的是更新现有对象的ID。当你设置record.id = 43然后调用save时,会发生的事情是ActiveRecord会尝试生成这样的SQL:

update records set id = 43 where id = 43

请注意,它正在寻找更新的ID与您尝试更改的ID相同。这就是为什么它不起作用。

所以是的,你必须使用SQL来改变它。这是一个好主意是否是另一个问题,但有时需要完成。

答案 2 :(得分:4)

  

我是否可能必须通过sqlite中的直接SQL来执行此操作?

ActiveRecord的重点是提取数据库函数,只返回数据集合。您不应该担心记录的ID,这是DB特有的。在我的头脑中,我想不出任何理由来引用模型的ID。

如果您的应用依赖于序列号,那么您应该将另一个字段添加到具有此序列的模型中。例如,如果我有一个带有产品的商店(产品型号),并且我提供了DB提供给其他供应商的ID号。两周后,我的老板要求我为两种不同的产品提供一个独特但类似的ID:“45a”和“45b”。坚果。 ID字段只能用于数据库和ActiveRecord ,而不是您或您的用户,以识别记录。

可能很可能是一个模糊的方法,如果数据库允许,则强制设置ID,但由于某种原因它是模糊的。不要试图找到它:)

即便如此,键入ruby script/dbconsole可快速启动sqlite界面,而无需输入密码。

另外,如果删除将重置计数器并从0开始的sqlite数据库。强大的功能带来了很大的责任。

修改

如果我没记错的话,戴夫托马斯在某处写了这个。也许是here