保持id没有间隙 - Rails

时间:2013-08-30 17:58:38

标签: ruby-on-rails

我有一个Rails应用程序,它有这样的路线:

objects/id

但是每个对象都可以删除。

因此,如果第一个对象(id = 1)被删除,则对象/ 1将为404 - 找不到。

我希望以这种方式保留它,如果删除id = 1的对象,id = 2的对象变为id = 1,对象3变为id 2,依此类推。

有可能吗?我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

完全不同意这种做法。想想,如果你的模型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实际上是不可能的,即使在某些用例中,也会导致性能下降。

答案 1 :(得分:0)

可以在非常费用下完成,并且存在完全搞砸一切的严重风险。重新编号也会损坏任何书签,使它们指向错误的记录。简短回答:不要这样做。

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

你应该做的是提出一个非基于身份的系统,比如使用slug。 Rails支持本地路由:

def to_param
  self.slug
end

现在,您可以为URL中显示的每条记录指定某种“slug”,最终结果如下:

/users/bob

在URL中公开ID总是一个不太理想的情况,因为这些可能是揭示不一定是公开的信息,并且他们还邀请篡改以发现可能无法正确保护的其他记录。 / p>