我在.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