代码之家  ›  专栏  ›  技术社区  ›  Jai Kumar Rajput Chaitanya Shivade

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

  •  0
  • Jai Kumar Rajput Chaitanya Shivade  · 技术社区  · 6 年前

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

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

    谢谢

    2 回复  |  直到 6 年前
        1
  •  3
  •   Stefan    6 年前

    您正在查找表的AUTO\u增量值。MySQL将此类元数据存储在 INFORMATION_SCHEMA 数据库AUTO\u增量值可以在 TABLES 桌子该表包含每个数据库和表的一个条目。

    我认为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\u增量值的当前值,例如。 11

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

        2
  •  1
  •   Sam Sabey    6 年前

    为什么要担心身份证?如果您对连续数字有其他原因,请使用另一个字段并在before\u create上执行一些select max操作。

    FWIW、MySQL和Mariadb auto increment仅在数据库重新启动时重置,这样可以避免争用情况。