ActiveRecord:如何克隆嵌套关联?

Shp*_*ord 25 activerecord clone ruby-on-rails associations ruby-on-rails-3

我目前正在克隆这样的单级关联:

class Survey < ActiveRecord::Base
  def duplicate
    new_template = self.clone
    new_template.questions << self.questions.collect { |question| question.clone } 
    new_template.save   
  end
end
Run Code Online (Sandbox Code Playgroud)

因此克隆那个Survey克隆Questions与该调查相关联.精细.这非常有效.

但我遇到的问题是每个问题has_many Answers.所以Survey has_many Questions which has_many Answers.

我无法弄清楚如何正确克隆答案.我试过这个:

def duplicate
  new_template = self.clone

  self.questions.each do |question|
    new_question = question.clone
    new_question.save

    question.answers.each do |answer|
      new_answer = answer.clone
      new_answer.save
      new_question.answers << answer
    end

    new_template.questions << question
  end

  new_template.save   
end
Run Code Online (Sandbox Code Playgroud)

但实际上替换原始答案然后创建新答案会产生一些奇怪的东西,因此ID会正确地停止匹配.

fl0*_*00r 45

使用deep_clonable gem

new_survey = original_survey.clone :include => [:questions => :answers]
Run Code Online (Sandbox Code Playgroud)

  • 现在它变为:new_survey = original_survey.deep_clone:include => [:questions =>:answers] (7认同)
  • clone方法已更改为dup.见[回购自述文件](https://github.com/moiristo/deep_cloneable) (2认同)