Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails克隆对象问题_Ruby On Rails_Clone - Fatal编程技术网

Ruby on rails Rails克隆对象问题

Ruby on rails Rails克隆对象问题,ruby-on-rails,clone,Ruby On Rails,Clone,假设我在rails中有一篇带有注释的博客文章,我如何克隆它,以便我有另一篇带有注释的博客文章,这两篇文章都以新对象的形式存储在数据库中,并带有它们自己的ID 我知道clone命令,但它似乎没有复制到注释上,只是复制到注释的链接 在rails中是否有插件或简单的方法来实现这一点 谢谢 定义深度复制方法 class BlogPost ... def deep_copy Marshal::load(Marshal.dump(self)) end ... end 这应该能奏效!

假设我在rails中有一篇带有注释的博客文章,我如何克隆它,以便我有另一篇带有注释的博客文章,这两篇文章都以新对象的形式存储在数据库中,并带有它们自己的ID

我知道clone命令,但它似乎没有复制到注释上,只是复制到注释的链接

在rails中是否有插件或简单的方法来实现这一点


谢谢

定义深度复制方法

class BlogPost
...
    def deep_copy
    Marshal::load(Marshal.dump(self))
    end
...
end
这应该能奏效!
编辑:只是想澄清一下,你用这个方法做的基本上是将你的对象序列化到内存中,然后在一个新的内存位置反序列化它,有效地创建一个新对象,它的字段值与原来的相同。

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

  • 克隆主对象,
    Post
  • 迭代主对象中的每个注释,克隆每个注释并将其附加到克隆的帖子中
  • 保存帖子,所有评论将被保存并附加到该帖子

  • 由于每个模型类的深度复制/克隆看起来都不一样,因此通常留给开发人员作为练习。这里有两种方法:

  • 覆盖克隆(如果您不总是希望出现这种行为,则可能很危险)

  • 创建一个deep\u clone或deep\u copy方法并专门调用它

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

  • 这两种方法都保证返回的Post对象及其所有注释在db中都是不同的实体(当然,一旦您在帖子上调用save)。

    如果我有以下结构:Blog-id 1,Comment-id 1,它会被克隆为:Blog-id 2,Comment-id 2还是:Blog-id 1,Comment-id 1?谢谢它将包含相同的值,因此Blog#id=1,Comment#id=1。不管怎样,你为什么不立即启动你的irb并进行测试呢?祝你一切顺利!谢谢-这种方法在某些情况下确实有用:)这是我计划依赖的默认解决方案。然而,用新id做深度克隆的东西会很棒。
    class Post
    ...
      def deep_clone
        new_post = clone
        new_post.comments = comments.collect { |c| c.clone }
        new_post
      end
    ...
    end