Вопрос клонирования рельсов - PullRequest
2 голосов
/ 06 октября 2010

Скажем, у меня есть запись в блоге с комментариями в rails, как мне ее клонировать, чтобы у меня была еще одна запись в блоге с комментариями, которые оба хранятся как новые объекты в базе данных со своими идентификаторами?команда clone, но, похоже, она не копирует комментарии - только ссылки на них.

Есть ли плагин или простой способ сделать это в рельсах?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 06 октября 2010

Почему вы хотите использовать плагины?Это действительно очень просто.

  1. клонировать главный объект, Post
  2. перебирать каждый комментарий в главном объекте, клонировать каждый комментарий и добавлять его в клонированный пост
  3. сохранить сообщение, все комментарии будут сохранены и прикреплены к этому сообщению
2 голосов
/ 07 октября 2010

Поскольку глубокое копирование / клонирование будет выглядеть по-разному для каждого класса 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
    

Оба этих параметра гарантируют, что возвращенный объект Post и все его комментарии будут отдельными сущностями в БДзвоните, экономьте на почте, конечно).

1 голос
/ 06 октября 2010

Определить метод глубокой копии

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

Это должно сработать! Редактировать: просто чтобы уточнить, что вы делаете с этим методом, это в основном сериализация вашего объекта в память, а затем десериализация его в новом месте памяти, эффективно создавая новый объект с теми же значениями поля, что и исходный.

...