ruby-on-rails - 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 是什么?
解决方案
这是因为在内部,ID 不是由 Rails 确定的——它是由 RDBMS 中的“序列”给出的。这个序列是一个运行中的计数器,每当您从中取出一个新数字时,它就会递增 - 无论您是否实际将该数字提交到您的表中。
这意味着尝试插入新行将增加序列计数器,并且由于您引发异常,因此不会保存该行。但这并不能改变一个数字已从序列中拉出并且无法放回其中的事实。
这些序列在大多数情况下也是表不可知的——如果你愿意,你可以在表之间共享相同的序列。
https://www.postgresql.org/docs/current/functions-sequence.html
推荐阅读
- tfs - Azure devops 管道触发器
- assembly - 当我运行程序时,输出是对 dumpregs 的两次调用
- android-studio - 为什么我打开 Android Studio 从不显示布局装饰?
- python - 为什么 Python dis module 不能反汇编这个 .pyc 文件?
- asp.net-mvc - 在负载平衡的实例中使用机器密钥,而不在 web.config 中存储解密密钥
- python - 如何从 BeautifulSoup 中获取搜索结果?
- gpu - GPU RAM 已占用但没有 PID
- bash - Bash/Shell -- 在日期之间插入换行符
- java - 什么是 C# WCF AddressHeader 的 Java Apache CXF 等价物?
- python - Nifi ExecuteStreamCommand 返回 UnicodeEncodeError