【发布时间】: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
但我的问题是:
我该如何做这个关联的其余部分
我应该在
Node中而不是SystemStatus中执行关联吗?看来我可以简单地做one_to_one :system_status而不必指定一个键.. 上面的复杂连接无论如何都驻留在node模型中。
【问题讨论】:
标签: mysql ruby join model sequel