如何避免重复保存在 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
我在 .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