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

nmi*_*ler 16 ruby ruby-on-rails

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

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

record.id = 43
record.save
Run Code Online (Sandbox Code Playgroud)

record = record.new
record.attributes = { :id => 43 }
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Fer*_*tin 39

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

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

>> sql = "update records set id=43 where id=44"
>> ActiveRecord::Base.connection.execute(sql)
Run Code Online (Sandbox Code Playgroud)

其中44是新创建的对象的id,而43是您在表中丢失的那个

祝好运!


Luk*_*ncl 23

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

record = Record.new
record.id = 1234
record.save
Run Code Online (Sandbox Code Playgroud)

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

update records set id = 43 where id = 43

请注意,它要更新的ID 与您尝试更改的ID 相同.这就是为什么它不起作用.

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


Chr*_*oyd 4

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

是的。

ActiveRecord 的全部要点是抽象数据库函数并仅返回数据集合。您不应该担心记录的 ID,这是数据库特有的内容。我一时想不出任何理由来引用模型的 ID。

如果您的应用程序依赖于具有序列号,那么您应该向具有该序列号的模型添加另一个字段。例如,如果我有一家包含产品(产品模型)的商店,并且我将数据库提供的 ID 号提供给其他供应商。两周后,我的老板要求我为两种产品提供一个唯一但相似的 ID:“45a”和“45b”。坚果。ID 字段只能由数据库和 ActiveRecord使用,而不是您或您的用户来识别记录。

如果数据库允许的话,有可能存在一种模糊的方法来强制设置 ID,但它之所以模糊是有原因的。不要试图找到它:)

话虽如此,键入ruby script/dbconsole即可快速调出 sqlite 界面,而无需输入密码。

另外,如果删除 sqlite 数据库,计数器将重置并从 0 开始。能力越大,责任越大。

编辑

如果我没记错的话,戴夫·托马斯在某处写过这件事。也许在这里