gpt4 book ai didi

mysql - 将复杂连接更改为 Sequel 关联

转载 作者:行者123 更新时间:2023-11-29 18:08:00 25 4
gpt4 key购买 nike

现在我有一段相对复杂的代码(其实没那么复杂),我想通过 Sequel 关联来简化

MyApp::Model::Node.where { last_heartbeat > Time.now - HEARTBEAT_TIMEOUT.seconds }.join(:system_status, node_id: Sequel.expr(:node__id))

这句话太恶心了。

所以我非常想完成一件事:通过用我的 SystemStatus 模型中的关联替换连接来简化上述语句。

让我解释一下上面的连接:

我有两个表NodeSystemStatus。比较 last_heartbeat > Time.now - HEARTBEAT_TIMEOUT.seconds 本质上为我提供了应用程序中的所有“事件节点”(我的应用程序是集群化的,这意味着用户可以同时生成它的多个实例) .

因此,这一困惑的语句给了我“我的事件节点的所有状态”,它由 system_status.node_id 连接到 node.id

因此,我首先在 SystemStatus 中建立一对一关系 - 这设置了与 node 表的关联

one_to_one :node

接下来,我需要通过特定键 node.id 连接它,因为它不是一个简单的连接

one_to_one :node, key: :id

但我的问题是:

  1. 我该如何完成该关联的其余部分

  2. 我应该在 Node 中执行关联,而不是在 SystemStatus 中执行吗?看来我可以简单地执行 one_to_one :system_status 而不必指定 key 。无论如何,上述复杂的连接都驻留在 node 模型中。

最佳答案

如果您在 SystemStatus 中有关联,则需要使用 many_to_one,因为外键位于该模型的表中,而不是关联模型的表中。您可以使用 block 将 where 条件传输到关联:

SystemStatus.many_to_one :live_node, class: :Node, key: :node_id do |ds|
ds.where{last_heartbeat > Time.now - HEARTBEAT_TIMEOUT.seconds}
end

关于mysql - 将复杂连接更改为 Sequel 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47660842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com