如何避免重复保存在从外部 JSON 文件解析的数据库中,使用 sidekiq 在 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

谢谢

顺便说一句,这是一个糟糕的解决方案,你的读取/存储代码中有一个巨大的竞争条件,你将无法使用Rails擅长的大部分内容。如果你想要一个简单的数据库,为什么不直接使用sqlite呢?

话虽如此,您需要某种识别重复项的方法,在大多数数据库中,这是通过主键完成的,该主键与其他数据一起发送到浏览器,然后再次返回任何更改。该主键用于确保更新现有数据,而不是复制现有数据。

您将在JSON文件中需要相同的内容,然后您可以将create方法更改为更像ActiveRecord的find_or_create_by

最新更新