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_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
是唯一的。在扫描模型中使用类似的东西在 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 方法用于两个相关连接表之间的关系并同时强制数据完整性