我将有两个轨道应用,一个是完全露面的,另一个是剥离的。这两个应用程序都有自己的数据库,它们将使用API相互通信。
我有两个这样的模型(在两个应用中(:
class Scan < ApplicationRecord
has_many :background_processes, dependent: :destroy
end
class BackgroundProcess < ApplicationRecord
belongs_to :scan
end
使用Web服务,任何记录保存的记录都触发了整个数据库的同步。现在,当两个应用程序之间的同步发生时,依赖模型(在这种情况下为background_processes
(将具有不同的scan_id
。
如果数据同步,我们应该如何处理关联?
我建议在scan
模型上使用另一个索引列,您可以在其中存储另一个ID或代币,您可以使用该ID或令牌来查询扫描记录。也许将其称为sync_id
或其他东西。
如果您采用此路线,则不必担心背景过程记录上的不同scan_id
s。只需确保使用扫描的JSON主体发送背景过程记录。(假设您使用JSON作为API的格式。(
这是一个总体想法。...您将确保发送API服务以依赖背景过程发送整个扫描记录。然后,接收API服务需要使用该扫描记录sync_id
查询现有扫描记录并进行更新。您还需要在后台过程记录上使用某种唯一标识符,以确保您不会创建重复。如果需要,也可以在背景过程上创建sync_id
。如果没有该ID的扫描记录,则创建它和因背景过程。
本质上,发送服务的API POST请求可能看起来像这样:
{
id: 1,
sync_id: "sometoken"
... # other record columns
background_process: [
{
id: 123,
... # other record columns
}
]
}
确保您使用的sync_id
是唯一的。在扫描模型中使用类似的内容在fortre_create Hook上生成它:
def set_sync_id
random_token = SecureRandom.urlsafe_base64
while Scan.where(sync_id: random_token).present? do
random_token = SecureRandom.urlsafe_base64
end
self.sync_id = random_token
end
您可以在Active Record上使用.create
CAND CAND,以及在Sync App上的true
的设置without_protection
。但是它有自己的安全风险。
Scan.create({id: <<primary-id>>, attrs....}, without_protection: true)