ran*_*its 42 activerecord ruby-on-rails
如果一个对象将被持久化到数据库,是否有一种紧凑的方式使用ActiveRecord来查询下一个要使用的id?在SQL中,像这样的查询看起来像:
SELECT max(id) + 1 FROM some_table;
Run Code Online (Sandbox Code Playgroud)
kim*_*een 89
这里稍微修改了Taryn East的版本:
Model.maximum(:id).next
Run Code Online (Sandbox Code Playgroud)
Les*_*ill 19
如果你的数据库是Postgres,你可以用这个得到下一个id(例如一个名为'users'的表):
ActiveRecord::Base.connection.execute("select last_value from users_id_seq").first["last_value"]
Run Code Online (Sandbox Code Playgroud)
与其他答案不同,此值不受删除记录的影响.
可能有一个mySQL等价物,但我没有一个设置确认.
如果已将数据导入postgresql数据库,则导入后的下一个id值很可能不会设置为大于您导入的最大值的下一个整数.因此,在尝试保存activerecord模型实例时会遇到问题.
在这种情况下,您需要手动设置下一个id值,如下所示:
ActiveRecord::Base.connection.execute("alter sequence users_id_seq restart with 54321;") #or whatever value you need
Run Code Online (Sandbox Code Playgroud)
Tar*_*ast 12
比接受的答案稍微好一些:
YourModel.maximum(:id) + 1
Run Code Online (Sandbox Code Playgroud)
仍然倾向于竞争条件等,但至少它会记录跳过的ID并且比通过id对表格进行排序然后返回最后一个更有效.
这是一个老问题,但是如果您删除了最后一条记录,则其他答案都无效:
Model.last.id #=> 10
Model.last.destroy
Model.last.id #=> 9, so (Model.last.id + 1) would be 10... but...
Model.create #=> 11, your next id was actually 11
Run Code Online (Sandbox Code Playgroud)
我使用以下方法解决了问题:
current_value = ActiveRecord::Base.connection.execute("SELECT currval('models_id_seq')").first['currval'].to_i
Model.last.id #=> 10
Model.last.destroy
Model.last.id #=> 9
current_value + 1 #=> 11
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
31899 次 |
最近记录: |