1

我正在根据用户输入以编程方式创建一些记录,并创建要导入的记录数组。

当我检查数据库时,如果它们是新记录,我可以看到关系已经创建。

如果其中一条记录已存在于数据库中,我可以在关联表中看到以下条目,但我还可以看到新记录已在各自的表中创建,因此它们存在但记录 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

如果其中一条记录已存在,则无法正确创建关系...

4

1 回答 1

1

您在单词循环中调用“find_or_initialize_by”,然后导入这些记录,这会在关键字表中为所有新记录创建一个新行。

到目前为止,一切都很好。

然后您的脚本获取第一个列表(持久记录和新记录)并尝试将它们与用户相关联。此时,它会为现有的关键字记录创建关联,但会尝试为刚刚在导入中创建的关键字记录再次创建新的关键字记录并关联这些记录。这些可能在那个时候无法通过唯一的验证,并且没有关联也没有持久化。

剩下的只是未关联但新创建的记录。

于 2019-09-17T20:38:11.750 回答