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

Posted

技术标签:

【中文标题】Rails:如何管理同步数据的两个表之间的关联?【英文标题】:Rails: How to manage associations between two tables syncing data? 【发布时间】:2019-07-29 15:40:59 【问题描述】:

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

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

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

class BackgroundProcess < ApplicationRecord
  belongs_to :scan
end

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

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

【问题讨论】:

如何在两个数据库之间进行同步? 【参考方案1】:

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

如果你走这条路线,你就不用担心后台进程记录上的scan_ids不同。请务必使用扫描的 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

【讨论】:

【参考方案2】:

您可以在活动记录上使用.create 方法调用以及在同步应用上将without_protection 设置为true。 但它有其自身的安全风险。

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

【讨论】:

以上是关于Rails:如何管理同步数据的两个表之间的关联?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 方法用于两个相关连接表之间的关系并同时强制数据完整性

excel两个工作表如何关联

Rails引用相同模型的活动记录关联

Rails 3 - 多个关联

Power bi怎么关联数据表?Power bi如何关联数据表啊?求解!!!

SQL 如何把两个表相关联的数据一同删除