ruby-on-rails - 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
.
在数据同步的情况下我们应该如何处理关联?
解决方案
我建议在模型上使用另一个索引列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
推荐阅读
- java - 如何避免相同的对象持久化多次elasticsearch
- excel - 如何将一系列混合的文本和数值转换为单个字符串,其中连续数值相加?
- apache - 将 documentroot 重定向到 conf apache 或 .htccess 中的另一个文件夹
- python - 从行索引的数据帧索引数据帧
- html - 在 div 中居中文本(链接)
- android - 如何在android的谷歌地图中添加自定义标记
- excel - 单元格值更改时自动运行 Excel VBA 宏
- java - 递归生成的东西的迭代器(不预先生成结果)
- cython - 如何创建任意大小的 cython 结构数组
- python - 为什么这不读取文件中的内容?Python