我需要创建一个包含要处理的模型对象的临时数组。我需要auto_increment主键,但是我不希望保留关联,因为当我从数组中删除对象时,它也会从数据库中删除它(感谢rails,非常不便)。我使用object.dup创建的深层副本的ID标记为nil。如何将它们保存在副本中?
答案 0 :(得分:2)
dup
描述了这种行为:
重复对象没有分配ID,将被视为新记录。
dup方法不保留(创建|更新)_(at | on)的时间戳。
之所以这样做,是因为人们几乎总是想复制记录,以便将记录的新副本保存到数据库中。
如果您需要一个真正相同的副本,clone
会做到这一点,但这几乎不再是您所需要的:您几乎可以肯定只想再引用同一对象。
在这种情况下,根据上下文和其他注释,我知道您的目标是一个记录列表,这样您就可以删除条目,而不会影响数据库。
为此,您仅需要to_a
。听起来您当前有一个ActiveRecord::Associations::CollectionProxy(或者如果没有ActiveRecord::Relation),它的作用类似于数组,但表示数据库中的关联集:它允许的操作将立即反映在数据库。 to_a
将为您提供一个代表该列表的普通Ruby数组;然后,您可以根据需要操纵该数组。 (根据该答案的前半部分,在这种情况下,您不需要需要复制单个记录……您只需要将它们存储在一个简单的数组中即可。)