【问题标题】:Changing a complex join into a Sequel association将复杂的联接更改为 Sequel 关联
【发布时间】:2018-05-19 12:58:22
【问题描述】:

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

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

这句话太恶心了。

所以我想完成一件事,非常简单:通过在我的SystemStatus 模型中将 join 替换为关联来简化上述语句。

让我解释一下上面的加入:

我有两张桌子Node 和SystemStatus。比较 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 而不必指定一个键.. 上面的复杂连接无论如何都驻留在node 模型中。

【问题讨论】:

    标签: mysql ruby join model sequel


    【解决方案1】:

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

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

    【讨论】:

    • 我不知道为什么,但是当我尝试上面的语句时,它说的是undefined method 'node_id' for #<MyApp::Model::Node:0x37ae1d57>。似乎试图将node_id 解释为一种方法
    猜你喜欢
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多