我有两个模型,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
。我想知道的是我还可以如何复制关联的对象,最好不要遍历它们或安装第 3 方 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
可能需要稍微调整一下才能与您的应用一起使用,但这是一般的想法。
关于ruby-on-rails - 关联上的 ActiveRecord .dup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35000409/