Rails: Дублировать запись и ее многоуровневые ассоциации?

Я создаю приложение для опросов и пытаюсь создать функцию дублирования, чтобы пользователи могли дублировать опросы.

Что мне нужно сделать, так это продублировать опрос, вопросы этого опроса и ответы на каждый вопрос (например, несколько вариантов выбора).

Вот мои ассоциации:

#Survey
has_many :questions

#Question
belongs_to :survey
has_many :answers

#Answer
belongs_to :question

Итак, как я могу дублировать/клонировать опрос, а также его ассоциации?

Я использую Rails 3.


person Shpigford    schedule 22.06.2011    source источник


Ответы (2)


Что-то типа:

#Survey
has_many :questions, :autosave => true   # might need the autosaves, might not

#Question
belongs_to :survey
has_many :answers, :autosave => true

#Answer
belongs_to :question


class Survey < ActiveRecord::Base

  def deep_copy(klass)
     klass.questions.each do |question|
        @question = self.questions.build(:name => question.name)
        question.answers.each do |answer|
           @question.answers.build(:name => answer.name)
        end
     end
  end
end

Итак, чтобы использовать его, сделайте что-то вроде:

@survey_to_copy = Survey.find(123)
@new_survey = Survey.new(:name => "new survey")
@new_survey.deep_copy(@survey_to_copy)
@new_survey.save
person Dex    schedule 22.06.2011
comment
Я не слежу за этим. Можете ли вы объяснить, что происходит? Я не понимаю, как запись опроса может быть клонирована здесь. - person Shpigford; 23.06.2011
comment
Определенно не работал. Он устанавливает survey_id каждого исходного вопроса для вновь созданного опроса вместо того, чтобы фактически клонировать вопросы. - person Shpigford; 23.06.2011
comment
Кроме того, на самом деле он не клонировал исходный опрос... он просто создал новый опрос без каких-либо данных. - person Shpigford; 23.06.2011
comment
Попробуйте еще раз с новыми правками, по сути, вы просто копируете материал вручную. - person Dex; 23.06.2011
comment
Сначала вам нужно создать опрос, в противном случае, я думаю, вам нужно установить параметр :autosave => true в ваших ассоциациях. - person Dex; 23.06.2011
comment
Это противоречит цели... Мне нужно продублировать опрос и его ассоциации. Создание нового опроса - это не то, что мне нужно сделать... Мне нужно его продублировать. - person Shpigford; 23.06.2011
comment
Меня немного смущает ваша терминология, но посмотрите мои правки еще раз и поэкспериментируйте с ней. - person Dex; 24.06.2011

Не уверен, что он совместим с Rails 3, но вам следует взглянуть на https://github.com/openminds/deep_cloning

person Benny Degezelle    schedule 22.07.2011