Rails:如何管理两个表之间的关联以同步数据?

8

我将拥有两个Rails应用程序,一个是完整的应用程序,另一个是简化版本。这两个应用程序都有自己的数据库,并且它们将使用API进行通信。

我在这两个应用程序中都有以下模型:

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

class BackgroundProcess < ApplicationRecord
  belongs_to :scan
end

任何保存的记录都会触发使用Web服务在数据库中进行同步。现在,当两个应用程序之间进行同步时,依赖模型(在本例中为background_processes)将具有不同的scan_id
在数据同步的情况下,我们应该如何处理关联?

2
你如何在两个数据库之间进行数据同步? - dharmesh
2个回答

3
我建议在“扫描”模型上使用另一个已索引的列,您可以在其中存储另一个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

0

在编程方面,您可以在活动记录上使用.create方法调用,并在同步应用程序上设置without_protectiontrue。但是这样做会带来安全风险。

Scan.create({id: <<primary-id>>, attrs....}, without_protection: true)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接