我有一个Model
我需要获取下一个记录ID,这个ID将在我的模型中创建该对象之前创建:
MyModel.last.id #=> 10
MyModel.last.destroy
MyModel.last.id #=> 9, so (Model.last.id + 1) would be 10... but...
MyModel.create #=> 11, my next id was actually 11
您能否建议一个更好的方法来解决我的问题?
由于
答案 0 :(得分:3)
您正在寻找表格的AUTO_INCREMENT值。 MySQL将这些元数据存储在INFORMATION_SCHEMA数据库中。可以在TABLES表中找到AUTO_INCREMENT值。该表包含每个数据库和表的一个条目。
我不认为Rails或MySQL gem提供了任何内置的获取方法。
我在之前的一个项目中使用了类似的东西:
# config/initializers/auto_increment.rb
module AutoIncrement
def auto_increment_value
connection.execute(<<-SQL.squish).first[0]
SELECT `AUTO_INCREMENT`
FROM `INFORMATION_SCHEMA`.`TABLES`
WHERE `TABLE_SCHEMA` = '#{connection.current_database}'
AND `TABLE_NAME` = '#{table_name}'
SQL
end
end
ActiveRecord::Base.extend(AutoIncrement)
然后您可以执行:
MyModel.auto_increment_value
它将返回表格的AUTO_INCREMENT值的当前值,例如11
。
请注意,将该值用作记录的显式ID是不安全的。您应该让MySQL处理新ID的分配 - 这是AUTO_INCREMENT的用途。
答案 1 :(得分:1)
为什么要担心身份证?如果您有其他原因需要连续的数字,请使用另一个字段并在before_create上选择max。
FWIW,MySQL和Mariadb自动增量仅在数据库重启时重置,这可以避免竞争情况。