在为Model Rails创建对象之前获取下一个Object Id

时间:2018-03-16 07:41:33

标签: mysql ruby-on-rails ruby information-schema

我有一个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

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

由于

2 个答案:

答案 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自动增量仅在数据库重启时重置,这可以避免竞争情况。