Rails克隆对象问题

时间:2010-10-06 19:02:16

标签: ruby-on-rails clone

假设我有一篇博客文章,其中包含rails中的注释,如何克隆它,以便我有另一篇带有注释的博客帖子,这两篇文章都作为新对象存储在数据库中并带有自己的ID?

我知道克隆命令,但它似乎没有复制注释 - 只链接到它们。

是否有插件或简单方法在rails中执行此操作?

谢谢!

3 个答案:

答案 0 :(得分:2)

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

  1. 克隆主对象Post
  2. 迭代主对象中的每个注释,克隆每个注释并将其附加到克隆的帖子
  3. 保存帖子,所有评论都会保存并附在该帖子上

答案 1 :(得分:2)

由于深度复制/克隆对于每个Model类看起来都不同,因此通常将其作为练习留给开发人员。这有两种方式:

  1. 覆盖克隆(如果你总是想要这种行为,可能会很危险)

    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
    
  3. 这两个都保证返回的Post对象及其所有注释都是db中的不同实体(当然,当你在Post上调用save时)。

答案 2 :(得分:1)

定义深层复制方法

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

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