ruby-on-rails - Ruby on Rails,在 activerecord-import 之后创建多对多关联
问题描述
我正在根据用户输入以编程方式创建一些记录,并创建要导入的记录数组。
当我检查数据库时,如果它们是新记录,我可以看到关系已经创建。
如果其中一条记录已存在于数据库中,我可以在关联表中看到以下条目,但我还可以看到新记录已在各自的表中创建,因此它们存在但记录 ID 未在关联表。
user_id: 1
keyword_id: null
但如果我第二次运行代码,它将正确添加关系。
这是我的代码
records_to_add = []
words.each do |word|
keyword = Keyword.find_or_initialize_by(
word: word,
device: device,
)
records_to_add.push(keyword)
end
keywords_added = Keyword.import records_to_add, on_duplicate_key_ignore: true, validate: true
user.keywords << records_to_add
我认为这部分代码有问题
user.keywords << records_to_add
如果其中一条记录已存在,则无法正确创建关系...
解决方案
您在单词循环中调用“find_or_initialize_by”,然后导入这些记录,这会在关键字表中为所有新记录创建一个新行。
到目前为止,一切都很好。
然后您的脚本获取第一个列表(持久记录和新记录)并尝试将它们与用户相关联。此时,它会为现有的关键字记录创建关联,但会尝试为刚刚在导入中创建的关键字记录再次创建新的关键字记录并关联这些记录。这些可能在那个时候无法通过唯一的验证,并且没有关联也没有持久化。
剩下的只是未关联但新创建的记录。
推荐阅读
- python - 没有 SQLContext 的 pyspark 中的 clearCache
- python - python中有没有办法最小化使用for循环获取常量值的二元函数?
- r - 用于从字符串中匹配和提取整数的正则表达式
- ruby-on-rails - Rails 如何从 Heroku 的错误 R15 中解救出来
- java - JPA:用具有相同ID的对象替换数据库中的对象
- jquery - 更改在页面中多个位置重复的按钮的状态,但仅更改被单击的按钮,而不更改其余按钮
- angularjs - 在检查元素的浏览器源代码中隐藏使用 ng-show 注释的 HTML 元素
- google-analytics-api - 当范围在 2016-08-23 之前开始时,GA 报告 API 返回 0 ga:users
- graphql - CraftQL - 无法在矩阵字段中找到标签字段
- node.js - 如何将 req.params 传递/使用到前端 js