首页 > 解决方案 > Rails:ActiveRecord 如何生成下一个主键

问题描述

我在保存回调方法后打印记录的 id,如下所示。打印“id”后,我提出了异常。

def after_save_run
  puts "id is #{self.id}"
  raise "exception"
end

上面的方法为每个保存调用生成下面的输出

id is 1
id is 2
id is 3

由于 after save 方法中的异常,没有记录保存在数据库中,因此我的表是空的,但是 acitverecord 如何自动增加主键?如果表中没有记录,activerecord 如何知道最后生成的 id 是什么?

标签: ruby-on-railsactiverecord

解决方案


这是因为在内部,ID 不是由 Rails 确定的——它是由 RDBMS 中的“序列”给出的。这个序列是一个运行中的计数器,每当您从中取出一个新数字时,它就会递增 - 无论您是否实际将该数字提交到您的表中。

这意味着尝试插入新行将增加序列计数器,并且由于您引发异常,因此不会保存该行。但这并不能改变一个数字已从序列中拉出并且无法放回其中的事实。

这些序列在大多数情况下也是表不可知的——如果你愿意,你可以在表之间共享相同的序列。

https://www.postgresql.org/docs/current/functions-sequence.html


推荐阅读