外键被解释为Sequel many_to_one关联中的方法

时间:2017-12-07 19:23:56

标签: sql ruby model associations sequel

目前在我的续集模型中处理协会。

我有一个名为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_idsystem_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仍未应用?

0 个答案:

没有答案