我有两个模型,Survey
和Question
。一个Survey
has_many :questions
和一个Question
belongs_to :survey
.我知道我可以通过执行以下操作来复制Survey
实例:
old_survey = Survey.last
new_survey = old_survey.dup
现在new_survey
将与old_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
,但我想找到一种更有效的方法来实现这一目标。
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
可能需要稍微调整一下才能与您的应用程序一起使用,但这是一般的想法。