Ruby on rails 克隆的ActiveRecord对象在保存期间向Postgres发送空id

Ruby on rails 克隆的ActiveRecord对象在保存期间向Postgres发送空id,ruby-on-rails,postgresql,activerecord,Ruby On Rails,Postgresql,Activerecord,我需要保存一个ActiveRecord对象的副本,因此我使用的是: @original = Model.find(params[:id]) @copy = @original.clone 但是,当我尝试将此保存到Postgres时: PGError:错误:“id”列中的null值违反not null约束 在控制台中: @复制.id =>零 如何使ActiveRecord不发送INSERT语句中的id列 更新: 我做了一个小改动后,问题就消失了: @new = Model.new(params[

我需要保存一个ActiveRecord对象的副本,因此我使用的是:

@original = Model.find(params[:id])
@copy = @original.clone
但是,当我尝试将此保存到Postgres时:

PGError:错误:“id”列中的null值违反not null约束

在控制台中:

@复制.id
=>零

如何使ActiveRecord不发送INSERT语句中的id列

更新:

我做了一个小改动后,问题就消失了:

@new = Model.new(params[:model])
@original = Model.find(x)
@clone = @original.clone
@new.foreign_key_id = @clone.foreign_key_id
我将最后一行替换为:

@new.foreign_key_id = @original.foreign_key_id

此更改从INSERT语句中删除了“id”。在一次成功的更改实验之后,我立即恢复了代码,并试图重现错误。我无法重现这个错误。可能是13日星期五?

只是猜测一下……但克隆对象的新记录是否为真

最好创建一个新的模型对象,并将属性设置为与旧对象相同,如下所示:

@copy = Model.new
@copy.attributes = @original.attributes

只是一个猜测……但克隆对象的
new\u记录?
是否返回true

最好创建一个新的模型对象,并将属性设置为与旧对象相同,如下所示:

@copy = Model.new
@copy.attributes = @original.attributes
你在呼叫,不是对象克隆。 基本克隆本质上是创建模型的新实例,复制属性散列并删除id键。基本上是按照卢克·弗兰西的建议去做

我肯定这是PostgreSQL的问题。因为这段代码适用于MySQL

@clone = @original.clone
@clone.save
您的错误可能与PostgreSQL处理自动增量的方式有关。我无法判断ActiveRecord是否试图在INSERT语句中传递未定义的id,何时不应该传递,或者定义是否出错

我对postreges了解不够,无法诊断问题。但我怀疑问题的根源可能在于定义表的迁移

出于好奇,Model.new(@original.attributes)=@original.clone的结果是什么?

您正在调用的是,而不是Object#clone。 基本克隆本质上是创建模型的新实例,复制属性散列并删除id键。基本上是按照卢克·弗兰西的建议去做

我肯定这是PostgreSQL的问题。因为这段代码适用于MySQL

@clone = @original.clone
@clone.save
您的错误可能与PostgreSQL处理自动增量的方式有关。我无法判断ActiveRecord是否试图在INSERT语句中传递未定义的id,何时不应该传递,或者定义是否出错

我对postreges了解不够,无法诊断问题。但我怀疑问题的根源可能在于定义表的迁移


出于好奇,
Model.new(@original.attributes)=@original.clone

请发布Rails生成的SQL,以便我们可以看到它尝试插入的内容。请发布Rails生成的SQL,以便我们可以看到它尝试插入的内容。很好。我没有意识到ActiveRecord超越了Ruby的克隆方法。这应该是完全可以调用的。结果是错误的。我更新了上面的问题,以包含此问题的解决方案,但我想我一定是做了其他事情导致此问题,因为我无法重现它。谢谢你们两位的帮助!好电话。我没有意识到ActiveRecord超越了Ruby的克隆方法。这应该是完全可以调用的。结果是错误的。我更新了上面的问题,以包含此问题的解决方案,但我想我一定是做了其他事情导致此问题,因为我无法重现它。谢谢你们两位的帮助!又好又简单。为我工作。更简单的是@copy=Model.new(@original.attributes)。非常简单。为我工作。更简单的是@copy=Model.new(@original.attributes)。