Дублируйте запись в Rails и заполните новую форму ее ассоциациями.

Мне нужно продублировать запись в Rails, затем она должна быть преобразована в новую форму перед созданием записи.

Все работает после этого полезного ответа, но мне также нужно заполнить запись ассоциациями has_many_belongs_to_many

метод dup() позволил мне продублировать все в записи, кроме ее ассоциаций, я также видел, что есть гем Amoeba, который может выполнять очень универсальное глубокое клонирование, но мне интересно, есть ли более простое решение без использования драгоценного камня


person Carlo    schedule 02.02.2013    source источник


Ответы (1)


В Rails нет встроенного глубокого клонирования. В Rails 2.3.x у вас было clone для клонирования атрибутов активной записи. В Rails >3 они переименовали этот метод в dup, и его документация теперь отсутствует. Однако он идентичен clone, и его документы говорят следующее.

Обратите внимание, что это «поверхностный» клон: он копирует только атрибуты объекта, а не его ассоциации. Степень «глубокого» клонирования зависит от приложения и, следовательно, предоставляется приложению для реализации в соответствии с его потребностями.

Так что если вы хотите клонировать ассоциации, вы сами по себе. В своих проектах для этой цели я использовал метод под названием replicate.

class User < ActiveRecord::Base
  # ...
  def replicate
    replica = dup

    comments.each do |comment|
      replica.comments << comment.dup
    end

    replica
  end
end

Что-то в этом роде.

person Max Chernyak    schedule 02.02.2013
comment
Разве это не должно быть replica.comments ‹‹ comment.dup? - person Toni; 14.04.2014
comment
@Правильный опыт, если вы хотите все дублировать. В моем случае я клонировал пользователя и перемещал связанные данные в новый. Не уверен на 100%, что хотел ОП, но я внес изменения, как вы предложили, потому что это кажется более подходящим для темы. - person Max Chernyak; 15.04.2014