【问题标题】:How to resuse deleted model id number in Rails?如何在 Rails 中重用已删除的模型 ID 号?
【发布时间】:2010-01-30 04:26:58
【问题描述】:

假设我有一个 Post 模型。当我删除最后一个帖子“帖子 24”时,我希望下一个帖子采用帖子 24 而不是帖子 25 的 ID。

我想在视图中显示 id 并且我不想丢失数字。我该怎么做?

感谢您的帮助。

【问题讨论】:

  • 注意:在询问 SQL 答案时,说明您使用的是什么类型(mysql、sqlserver、oracle 等)会很有帮助

标签: sql ruby-on-rails


【解决方案1】:

id 的目的仅仅是一个内部标识符。它根本不应该公开使用。这不是 Rails 问题,而是数据库问题。 MySQL 不会回收 id,因为它会导致您的应用程序出现非常严重的并发症。如果一条记录被删除,它的 id 将永远保持不变,这样以后的记录就不会被误认为它。

但是,有一种方法可以做你想做的事。我相信你想要一个 position 整数列。将其添加到您的模型/表中,然后安装 acts_as_list plugin

按常规方式安装:

script/plugin install git://github.com/rails/acts_as_list.git

然后将“钩子”添加到您的模型中:

class Post < ActiveRecord::Base
  acts_as_list
end

现在您的帖子模型的position 列将自动跟踪自身,没有序列间隙。如果您愿意,它甚至会为您提供一些方便的重新订购方法。

【讨论】:

  • +1 这正是我正在考虑阅读问题的答案,包括使用acts_as_list。
  • 啊,我明白了...我想在我的档案栏中显示帖子的编号。感谢您的建议。
  • 如果你已经有一个不同的整数列要使用,或者你不想称它为位置,你可以调用带有参数的钩子:“acts_as_list :column => 'archive'”,例如。
【解决方案2】:

相反,您可以让 SQL 自己执行此操作:

SELECT rownum AS id, [whatever other columns you want]
FROM posts_table
WHERE [conditions]
ORDER BY [ordering conditions]

这将为每一行添加数字,而不会像您说的那样跳过任何内容。

注意:我使用 Oracle。我不知道这个确切的代码是否适用于其他风格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    相关资源
    最近更新 更多