在为模型创建对象之前获取下一个对象 ID Rails

Get the next Object Id before create the object for a Model Rails

我有一个 Model 在我的模型中创建该对象之前,我需要获取将要创建的下一个记录 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

你能建议一个更好的方法来解决我的问题吗?

谢谢

您正在查找 table 的 AUTO_INCREMENT 值。 MySQL 将此类元数据存储在 INFORMATION_SCHEMA database. The AUTO_INCREMENT values can be found in the TABLES table 中。 table 包含每个数据库的一个条目和 table.

我不认为 Rails 或 MySQL gem 提供任何 built-in 方法来获取它。

我在之前的一个项目中使用过类似的东西:

# 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

并且它将 return table 的 AUTO_INCREMENT 值的当前值,例如11.

请注意,将该值用作记录的显式 ID 是不安全的。您应该让 MySQL 处理新 ID 的分配——这就是 AUTO_INCREMENT 的用途。

为什么要担心id?如果您有其他一些连续数字的原因,请使用另一个字段并在 before_create.

上做一些 select max

FWIW、MySQL 和 Mariadb 自动增量仅在数据库重新启动时重置,这避免了竞争情况。