导轨:如何管理两个表同步数据之间的关联



我将有两个轨道应用,一个是完全露面的,另一个是剥离的。这两个应用程序都有自己的数据库,它们将使用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)

相关内容

  • 没有找到相关文章

最新更新