如何避免重复保存在 Rails 中使用 sidekiq 从外部 JSON 文件解析的数据库中

How to avoid duplicates from saving in database parsed from external JSON file with sidekiq in Rails

我在 .json 文件中有一个小的待办事项列表,我使用 Sidekiq 读取、解析并保存到 rails 应用程序。每次我刷新浏览器时,工作人员都会执行并复制数据库中的条目。如何维护与 .json 文件同步的唯一数据库并避免重复条目保存在我的数据库中并显示在我的浏览器中?

这是工作人员:

class TodoWorker
  include Sidekiq::Worker

  def perform
    json_text = File.read('todo_json.json')
    json = JSON.parse(json_text, :headers => true)
    json.each do |todo|
      t = TodoList.create(name: todo["name"], done: todo["done"])
      t.save
    end
  end
end

控制器:

class TodoListsController < ApplicationController
  def index
    @todo_lists = TodoList.all
    TodoWorker.perform_async
  end
end

谢谢

顺便说一句,这是一个糟糕的解决方案,您的 read/store 代码中存在巨大的竞争条件,并且您将无法使用 Rails 的大部分优点在。如果你想要一个简单的数据库,为什么不直接使用 sqlite?

也就是说,您需要某种识别重复项的方法,在大多数数据库中,这是通过将主键与其余数据一起发送到浏览器,然后在进行任何更改后再次返回。该主键用于确保现有数据得到更新,而不是重复。

您的 JSON 文件中需要同样的东西,然后您可以将 create 方法更改为更类似于 ActiveRecord 的 find_or_create_by