我正在保存后回调方法中打印记录的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是什么?
这是因为在内部,ID不是由Rails决定的,而是由RDBMS中的"序列"给定的。这个序列是一个运行计数器,每当你从中提取一个新的数字时,它就会递增——无论你是否真的将该数字提交到表中。
这意味着尝试插入新行将增加序列计数器,并且由于您正在引发异常,因此不会保存该行。但这并不能改变这样一个事实,即一个数字已经从序列中提取出来,不能再放回序列中
序列在很大程度上也是表不可知的——如果你愿意,你可以在表之间共享相同的序列
https://www.postgresql.org/docs/current/functions-sequence.html