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

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

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

相关文章:

ruby-on-rails - 我可以在 Refile 初始化程序中为 Rails 4 项目中的不同功能配置单独的 S3 存储桶吗?

ruby-on-rails - 两个表之间的连接在 Activerecord 中失败,出现未初始化的常量错误

mysql - 使用 ruby​​ 将变量写入 mysql 的事件记录

mysql - 如何显示 "parent"公司以及给定位置的设施数量?

ruby-on-rails - 使用 i18n-active_record : same form for same key 的 I18n 转换

javascript - rails : How to create javascript object from controller?

javascript - asset pipeline rails 3.1 是否浪费周期?

ruby-on-rails - Rails 是否缓存模板?

ruby - 重新启用 Rails 4 自动解释

ruby-on-rails - 使用多个 yield 插入内容