关于协会的ActiveRecord .dup

时间:2016-01-25 19:09:33

标签: ruby-on-rails ruby-on-rails-4 activerecord

我有两个模型,SurveyQuestionSurvey has_many :questionsQuestion belongs_to :survey。我知道我可以通过执行以下操作复制Survey的实例:

old_survey = Survey.last
new_survey = old_survey.dup

现在new_surveyold_survey相同,只是其id属性为nil。我想知道的是我如何复制相关对象,最好不要迭代它们或安装第三方gem。

我想做这样的事情:

old_survey = Survey.last
new_survey = old_survey.dup
new_survey.questions = old_survey.questions.dup
old_survey.save!

上述代码不起作用。如果我拨打new_survey.questions.pluck(:id),我可以看到ID与old_survey.questions.pluck(:id)匹配,这是不可取的。

显然我可以遍历old_survey.questions,但我想找到一种更有效的方法来实现这一目标。

1 个答案:

答案 0 :(得分:4)

您可以使用deep_clonable gem: https://github.com/moiristo/deep_cloneable

然后你可以这样做:

old_survey.dup include: :questions

但这会为您的应用添加另一个依赖项。最简单的方法是迭代旧的调查问题并根据需要分配ID。你的问题表明你想避免这样做,但我认为这是最好的(也是最轻量级的)选择。

如果你愿意循环关联对象,这应该可以解决问题:

def clone_with_questions
  new_survey = self.dup
  new_survey.save
  new_survey.questions = self.questions
  new_survey
end

@new_survey = Survey.last.clone_with_questions

可能需要调整一下才能使用您的应用,但这是一般的想法。