Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 是Rails ActiveRecord对象id';它保证是单调递增的?_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails 是Rails ActiveRecord对象id';它保证是单调递增的?

Ruby on rails 是Rails ActiveRecord对象id';它保证是单调递增的?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我希望能够按照创建对象的顺序返回对象。显然,我可以使用创建的_at字段来执行此操作,但这在我的测试脚本中不起作用,因为我已经将Time.zone.now去掉,以始终返回相同的时间 AR是否保证下一个id始终大于上一个对象,或者是否有可能重用已删除的id。我很确定数据库提供这两种类型的功能,但是Rails默认选择什么 编辑: 对SQLite驱动程序的测试表明它是单调的。即使我删除了表中的所有记录,关闭会话,打开会话并创建更多记录,新记录的id也比以前删除的对象的id大。然而,我不想依赖经验证据。如

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

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

编辑:


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

Active Record在不指定ID的情况下进行插入,然后检索创建它时使用的ID,所以我猜这是一个特定于数据库的设置。

不能保证ID与插入顺序匹配,但通常是安全的

例如:如果您有一个非常大的数据库,由于删除的项目而累积了很多漏洞,那么您可以压缩它并重置底层序列(或数据库用于生成ID的任何序列),以恢复一些未使用的值。Rails只使用数据库的实现,但您的DBA(或戴着DBA帽子的您)并没有受到这样的约束


id应该在短期内单调增加,除非您最终使用某种令人讨厌的数据库,希望您受到影响。

我在active record源代码树中找到代码,表明他们正在使用数据库序列生成id。从理论上讲,这应该保证单调性,但Rails中并没有真正记录到这一点,因此我对我的旧id感到不安。。杀了我:)@daveatflow:这属于“让你受苦的可恨数据库”吗?我自己从来没用过。