Rails ActiveRecord对象id是否保证单调递增?

时间:2011-08-18 07:45:39

标签: ruby-on-rails ruby activerecord

我希望能够按创建顺序返回对象。显然我可以使用created_at字段来执行此操作,但这在我的测试脚本中不起作用,我已经将Time.zone.now保留为始终返回相同的时间。

AR是否保证下一个id始终大于最后一个对象,或者是否有可能重用已删除的ID。我很确定数据库提供两种类型的功能,但Rails默认选择什么?

编辑:

使用SQLite驱动程序进行测试表明它是单调的。即使我删除了表中的所有记录,也要关闭会话,打开会话并创建更多记录,新记录的id的ID大于先前删除的对象的id。但是我不想在这里依赖经验证据。如果有人对ActiveRecord的设计意图有明确的答案,那将不胜感激。

2 个答案:

答案 0 :(得分:4)

Active Record执行INSERT而不指定ID然后检索它创建的ID,所以我猜这是一个特定于数据库的设置。

答案 1 :(得分:3)

无法保证ID与插入订单匹配,但您通常会安全。

例如:如果你有一个非常大的数据库,由于删除了项目而累积了很多漏洞,你可以压缩它并重置基础序列(或者你的数据库使用什么来生成ID)来恢复一些未使用的值。 Rails只是使用数据库的实现,但你的DBA(或你的DBA帽子)不受限制。

ID应该在短期内单调增加,除非你最终使用某种想让你受苦的仇恨数据库。