2010-10-06 120 views
2

假设我有一个在rails中有评论的博客文章,我如何克隆它,以便我有另一个带有注释的博客文章,它们都以自己的ID作为新对象存储在数据库中?Rails克隆对象问题

我知道克隆命令,但它似乎没有复制到评论链接。

有没有插件或简单的方法来做到这一点在铁轨?

谢谢!

回答

2

由于每个Model类的深拷贝/克隆看起来都不同,所以通常将其作为练习留给开发人员。这里有两种方法:

  1. 覆盖的clone(可能是危险的,如果你不这样做总是希望这种行为)

    class Post 
    ... 
        def clone 
        new_post = super 
        new_post.comments = comments.collect { |c| c.clone } 
        new_post 
        end 
    ... 
    end 
    
  2. 创建deep_clone或DEEP_COPY方法,并调用它专门

    class Post 
    ... 
        def deep_clone 
        new_post = clone 
        new_post.comments = comments.collect { |c| c.clone } 
        new_post 
        end 
    ... 
    end 
    

这两个都保证了re打开Post对象和它的所有注释都会在db中有不同的实体(当然,一旦你调用了Post的保存)。

1

定义深拷贝方法

class BlogPost 
... 
    def deep_copy 
    Marshal::load(Marshal.dump(self)) 
    end 
... 
end 

这应该做的伎俩! 编辑:只是为了澄清,你用这个方法做什么基本上是序列化你的对象到内存然后反序列化它在一个新的内存位置,有效地创建一个新的对象具有相同的字段值作为原始的。

+0

如果我有以下结构: 博客 - ID 1,评论 - ID 1 将它克隆为: 博客 - ID 2,评论 - ID 2 或者为: 博客 - ID 1,评论 - id 1? 谢谢! – stringo0 2010-10-06 19:25:15

+0

它将包含相同的值,所以Blog#id = 1,Comment#id = 1。无论如何,你为什么不解雇你的irb并立即测试?祝一切顺利! – Jas 2010-10-06 19:28:37

+0

谢谢 - 这种方法在某些情况下肯定有用:) – stringo0 2010-10-06 20:50:44

2

为什么要使用插件?这真的很简单。

  1. 克隆的主对象时,Post
  2. 叠代在主对象中的每个评论,克隆每个注释,并追加到克隆后
  3. 保存后,所有意见将被保存并连接到该帖子
+0

这是我计划依靠的默认解决方案。但是,使用新ID进行深层克隆的内容将非常棒。 – stringo0 2010-10-06 19:27:47