Ruby on rails 克隆/复制ActiveRecord::基本实例,包括属性 问题

Ruby on rails 克隆/复制ActiveRecord::基本实例,包括属性 问题,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我需要同一条记录的两个ActiveRecord::Base实例 副本的要求很简单: 两个实例必须表示相同的记录 我应该能够在不影响另一个实例的情况下更改一个实例的属性 #复制和克隆 我的第一个想法是使用#dup或#clone,但这些方法存在以下问题: #dup创建一个新记录。见: #克隆创建一个“浅”拷贝。这意味着,如果我更改副本上的属性,则原始对象上的该属性也会更改。见: 当前解决方案 我目前有两种解决我问题的方法,但它们感觉不太对 some\u object\u copy=SomeObj

我需要同一条记录的两个ActiveRecord::Base实例

副本的要求很简单:

  • 两个实例必须表示相同的记录
  • 我应该能够在不影响另一个实例的情况下更改一个实例的属性
  • #复制和克隆 我的第一个想法是使用#dup或#clone,但这些方法存在以下问题:

    • #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
    。这可能会导致意外行为。