在为模型创建对象之前获取下一个对象 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 自动增量仅在数据库重新启动时重置,这避免了竞争情况。
我有一个 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 maxFWIW、MySQL 和 Mariadb 自动增量仅在数据库重新启动时重置,这避免了竞争情况。