【发布时间】:2012-06-19 14:14:48
【问题描述】:
我像这样创建一个新记录:
truck = Truck.create(:name=>name, :user_id=>2)
我的数据库目前有数千个卡车实体,但我将 id 分配给了其中几个实体,以某种方式留下了一些可用的 id。所以发生的事情是 rails 创建了 id = 150 的项目,它工作正常。但随后它尝试创建一个项目并为其分配 id = 151,但该 id 可能已经存在,所以我看到了这个错误:
ActiveRecord::RecordNotUnique (PG::Error: ERROR: duplicate key value violates unique constraint "companies_pkey"
DETAIL: Key (id)=(151) already exists.
下次我运行该操作时,它会简单地分配 id 152,如果尚未采用该值,它将正常工作。如何让 rails 在分配 ID 之前检查它是否已经存在?
谢谢!
编辑
卡车 id 是被复制的。用户已经存在并且在这种情况下是一个常量。这实际上是我必须处理的遗留问题。一种选择是,这次在 let rails auto assign each id 时重新创建表。我开始认为这可能是最好的选择,因为我还有其他一些问题,但是这样做的迁移会非常复杂,因为 Truck 是许多其他表中的外键。是否有一种简单的方法让 rails 使用已存储在 Truck 下的相同数据创建一个新表,并使用自动分配的 ID 并维护所有现有关系?
【问题讨论】:
-
为什么不让 rails 自动分配 ID?这将消除任何重复的危险——或者这是您必须保留旧 ID 的遗留数据问题?只是想稍微了解一下业务案例,因为在创建新对象时这并不像往常一样。
-
@MBHNYC 我认为 D-Nice 在创建公司时分配了一个 user_id,而不是你想的 id(我也做了一会儿)。
-
太好了,阿尼尔——你完全正确。 @D-Nice,也许将此表的迁移添加到您的帖子中,以防有什么奇怪的地方?很想编辑掉那个 user_id 以消除混乱..
-
不,抱歉不清楚,公司 ID 是被复制的。用户已经存在并且在这种情况下是一个常量。这实际上是我必须处理的遗留问题。将使用更多信息编辑帖子
-
您不需要重新创建表。只需查看我的答案即可重置序列。
标签: ruby-on-rails ruby-on-rails-3 postgresql