gpt4 book ai didi

ruby-on-rails - 关联上的 ActiveRecord .dup

转载 作者:行者123 更新时间:2023-12-04 07:38:39 24 4
gpt4 key购买 nike

我有两个模型,SurveyQuestion。一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com