目前在我的续集模型中处理协会。
我有一个名为Node
的类,它管理单个应用程序的多个实例。在这个问题的背景下,细节并不太重要。
class Node < Sequel::Model(:node)
many_to_one(:system_status, key: :node_id) { |ds| ds.where(:last_heartbeat > Time.now - HEARTBEAT_TIMEOUT.seconds) }
...
def get_all_system_status_of_all_live_nodes
self.system_status
end
end
上面的代码基本上是我尝试模拟以下连接,我正在重构/替换(用关联替换模型中的连接):
MyApp::Model::Node.where { last_heartbeat > Time.now - HEARTBEAT_TIMEOUT.seconds }.join(:system_status, node_id: Sequel.expr(:node__id))
正如您所知,上面的代码段获取所有“活动节点”(由每几秒钟“跳动”的心跳确定),然后在每个节点的相应表中获取系统状态。
这是我的问题 - 当我尝试运行get_all_system_status_of_all_live_nodes
时,我收到以下错误:
0> self.system_status
=> undefined method `node_id' for #<MyApp::Model::Node:0x38a1c402>
注意:self
会返回MyApp::Model::Node
由于某种原因,似乎是将node_id
(system_status
中的外键)解释为一种方法。
编辑:
我能够到达某处:
one_to_one(
:system_status,
:key => :node_id
) do |ds|
ds.where("last_heartbeat > ?", Time.now - HEARTBEAT_TIMEOUT.seconds)
end
产生了以下SQL语句:
SELECT * FROM "SYSTEM_STATUS" WHERE (("SYSTEM_STATUS"."NODE_ID" = 398) AND (last_heartbeat > TIMESTAMP '2017-12-07 16:38:44.243726')) LIMIT 1
看起来JOIN仍未应用?