Ruby on rails 保持id';没有间隙的s-导轨

Ruby on rails 保持id';没有间隙的s-导轨,ruby-on-rails,Ruby On Rails,我有一个Rails应用程序,它有如下路线: objects/id 但每个对象都可以删除 所以,如果第一个对象(id=1)被删除,那么objects/1将是404-找不到 我想保持这种方式,如果id=1的对象被删除,id=2的对象变成id=1的对象,id=2的对象3,依此类推 可能吗?我该怎么做 完全不同意这种方法。试想,如果您的模型A与其他模型B有关系,并且模型A更改了对象ID,那么您必须对所有引用对象执行相同的操作 如果您在某个事务的中间删除某个对象,并且提交了删除操作,直到引用同一个对象i

我有一个Rails应用程序,它有如下路线:

objects/id
但每个对象都可以删除

所以,如果第一个对象(id=1)被删除,那么objects/1将是404-找不到

我想保持这种方式,如果id=1的对象被删除,id=2的对象变成id=1的对象,id=2的对象3,依此类推


可能吗?我该怎么做

完全不同意这种方法。试想,如果您的模型A与其他模型B有关系,并且模型A更改了对象ID,那么您必须对所有引用对象执行相同的操作

如果您在某个事务的中间删除某个对象,并且提交了删除操作,直到引用同一个对象id为止,那将是一个大麻烦

 obj1 = SomeModel.all.first    #id = 1

 obj2 = SomeModel.all.second   #id = 2 
现在销毁obj1

 obj1.destroy #now in database obj2 record's id becomes 1
但是obj2直到id为2(因为没有更新,请记住
obj.reload
)。当您尝试保存obj2时;这将导致状态不一致

因此,在rails中修改id确实是不可能的,即使在某些用例中,也会导致性能大幅下降

这项工作可能会花费非常大的费用,而且有完全搞砸一切的严重风险。重新编号还会损坏任何书签,使它们指向错误的记录。简短回答:不要这样做

作为规则:数据库ID一旦分配,就不应该更改。这有很多很好的理由,但最重要的是该ID将在许多其他表中引用,并且所有这些引用也必须更新。通常没有简单的方法可以做到这一点

您应该做的是开发一个非基于ID的系统,比如使用slug。Rails支持以本机方式路由到以下位置:

def to_param
  self.slug
end
现在,您可以为URL中出现的每条记录分配某种类型的“slug”,结果如下:

/users/bob

在URL中公开ID通常不是一个理想的情况,因为这些ID可能会泄露不一定是公开的信息,并且还会导致篡改以发现其他可能未得到适当保护的记录。

这是一个非常非常非常糟糕的主意,与Rails的工作方式相反。id为3的对象应始终具有id 3,这是休息点。每次删除记录时,系统中的每个URL都将失效。人们可能会有指向这些页面的链接或书签,这些页面突然变成指向随机不同页面的链接。如果您删除给定URL上的资源,该URL应为404,而不是成为某个随机的不同资源。这样做没有任何好处,许多人会退缩。你绝对不应该这样做。你不应该这样做!这没有好处。相反,您将无法理解历史日志或URL。activerecord中关于ID的全部想法是它们永远不会改变!谢谢这是有道理的。级联外键并不是一个真正的问题,问题是当ID保存在某个远程系统中时,更新可能无法级联到该系统,就像每个客户端的书签一样。这听起来很好,但是如果您的数据被两个不同的进程修改,比如两个不同的web请求,其中一个仍在进行中?您需要执行一些主动锁定。我不是说这不是一个问题,我只是说技术上无法克服的问题是,任何给定记录的删除都会破坏你网站的所有链接。我完全同意:)