【问题标题】:In Ruby on Rails, how to create a record with ID 3 when it was destroyed earlier?在 Ruby on Rails 中,如何在之前销毁时创建 ID 为 3 的记录?
【发布时间】:2010-08-25 16:11:45
【问题描述】:

我正在尝试一个实验性 Rails 项目并销毁了记录 3(ID == 3),所以现在有记录 1、2、4 和 5。

有没有办法用从 1 到 5 的记录 ID 重新填充此表? (这是使用mysql)

我可以使用

if Item.exists?(i)
  item = Item.find(i)
else
  item = Item.new
end

# set some values
item.name = "haha" + i
item.save

Item.new() 是用新的自增记录 ID(本例中为 6)创建新记录,但是之前删除的那些呢?

【问题讨论】:

    标签: mysql ruby-on-rails activerecord


    【解决方案1】:

    您可以使用以下方法设置 ID:

    item = Item.new
    item.id = i
    

    您不能将:id => i 传递给Item.new,因为id 是一个特殊属性,并且会自动防止批量赋值。

    你也可以告诉 MySQL 重新从 1 开始计数,它会自动填充所有缺失的 ID:

    Item.connection.execute("ALTER TABLE items AUTO_INCREMENT = 1")
    

    (实际上,MySQL 文档说这会将其重置为MAX(id) + 1,因此在这种情况下它最终不会使用 3。)

    【讨论】:

    • +1 ALTER TABLE items AUTO_INCREMENT = 是mysql中的命令
    【解决方案2】:

    您可能知道,MySQL 不会为您执行此操作。在创建每一个项目时,您可以返回并查看是否有任何未使用的 ID 号,并使用它们来代替。 (我打赌你可以明确设置id,虽然我没有尝试过。)我不推荐这个的原因有两个:

    • 当您处理大量记录时,它会显着减慢记录的创建速度。
    • 一个项目的 ID 通常意味着永远引用它。特别是如果您打算在 URL 中使用 ID,则不应重复使用以前使用过的 ID 号,以保持数据一致性。已删除的项目应删除所有痕迹。

    也就是说,如果您谈论的是在您投入生产后在每个项目创建中使用未使用的 ID 号。如果您只是在谈论一次性交易,因为没有第 3 项会困扰您……您的时间最好花在其他事情上。

    【讨论】:

      【解决方案3】:

      你可以像@wuputah 说的那样做。而且通常我们不应该从表中删除记录,除非它不是主表(因为它可能会影响其他表关系)。相反,我们可以不活动的记录(比如有一个名为活动的表列)

      为了让事情变得更简单,你可以使用像 act_as_paranoid 这样的插件来实现这一点 http://github.com/technoweenie/acts_as_paranoid

      干杯

      同人

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-12
        • 1970-01-01
        • 2011-02-28
        • 2023-03-16
        相关资源
        最近更新 更多