首页 > 解决方案 > Rails:如何管理同步数据的两个表之间的关联?

问题描述

我将拥有两个 Rails 应用程序,一个是成熟的,另一个是精简的。这两个应用程序都有自己的数据库,它们将使用 API 相互通信。

我有两个这样的模型(在两个应用程序中):

class Scan < ApplicationRecord
  has_many :background_processes, dependent: :destroy      
end

class BackgroundProcess < ApplicationRecord
  belongs_to :scan
end

保存的任何记录都会使用 Web 服务触发跨数据库的同步。现在,当两个应用程序之间发生同步时,依赖模型(在这种情况下background_processes)将具有不同的scan_id.

在数据同步的情况下我们应该如何处理关联?

标签: ruby-on-railsweb-servicesassociationsdata-synchronization

解决方案


我建议在模型上使用另一个索引scan,您可以在其中存储另一个可用于查询扫描记录的 id 或令牌。也许叫它sync_id什么的。

如果你走这条路线,你就不用担心scan_id后台进程记录上的不同了。请务必使用扫描的 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您使用的是独一无二的。在扫描模型中使用类似的东西在 before_create 钩子上生成它:

  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

推荐阅读