Ruby on rails 克隆/复制ActiveRecord::基本实例,包括属性 问题
我需要同一条记录的两个ActiveRecord::Base实例 副本的要求很简单:Ruby on rails 克隆/复制ActiveRecord::基本实例,包括属性 问题,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我需要同一条记录的两个ActiveRecord::Base实例 副本的要求很简单: 两个实例必须表示相同的记录 我应该能够在不影响另一个实例的情况下更改一个实例的属性 #复制和克隆 我的第一个想法是使用#dup或#clone,但这些方法存在以下问题: #dup创建一个新记录。见: #克隆创建一个“浅”拷贝。这意味着,如果我更改副本上的属性,则原始对象上的该属性也会更改。见: 当前解决方案 我目前有两种解决我问题的方法,但它们感觉不太对 some\u object\u copy=SomeObj
- #dup创建一个新记录。见:
- #克隆创建一个“浅”拷贝。这意味着,如果我更改副本上的属性,则原始对象上的该属性也会更改。见:
some\u object\u copy=SomeObject.find(some\u object.id)
这个解决方案创建了一个额外的数据库查询,内存中已经有一些对象
,这应该是不需要的some\u object\u copy=SomeObject.instantiate(some\u object.attributes)
这个解决方案看起来太麻烦了。我觉得应该有一种更干净的方法来创建副本是否有更干净的方法解决此问题?编组如何
some_object\u copy=Marshal.load(Marshal.dump(some_object))
@tbuehlmann这并不是那么简单,因为它们到处都是不可mashallable的进程(除非最近发生了变化),所以您必须编写自己的加载/转储方法。对于我来说,这是一个非常基本的模型,但您可能是对的。约翰,值得一试吗?为什么不使用.dup
然后自己设置ID?它不会将被复制的记录保存到数据库中。现在这两个都代表同一条记录。@emaillenin如果我设置了id,它仍然标记为新记录。这意味着new\u记录?
返回true
,持久化?
将返回false
。这可能会导致意外行为。