续集JOIN和WHERE

时间:2017-09-18 22:25:06

标签: mysql ruby sequel

我有以下MySQL声明:

SELECT
    a.id,
    b.category,
    b.message,
    b.is_valid
FROM
    "NODE" a,
    "SYSTEM_STATUS" b
WHERE 
    ("LAST_HEARTBEAT" > TIMESTAMP '2017-09-18 15:10:04.471826') AND 
    a.id = b.node_id

我想将上述内容转换为续集

我有这个方法,它是上述MySQL语句的缩减版本:

0> self.class.live_nodes

SELECT "ID" FROM "NODE" WHERE ("LAST_HEARTBEAT" > TIMESTAMP '2017-09-18 15:11:12.906017')

=> [#<MyApp::Model::Node @values={:id=>348}>]

现在,使用此方法的结果,我想使用名为join的表格system_status,其中node.id = system_status.node_id的结果。

接下来,我想获取live_nodes的结果并将其加入system_status,其中结果等于system_status.node_id,我不知道该怎么做。

我尝试了以下内容:

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

但收到此错误

=> no implicit conversion of Symbol into Integer

不确定如何修复它..我也不认为我正在正确地进行锯齿

1 个答案:

答案 0 :(得分:0)

你与join非常接近,但我相信它应该是

# basically table_name, left_side, right_side
join(:system_status, node_id: :id) 

对于更明确的连接,以下内容也应该起作用

# Sequel > 4.38.0
join(:system_status, node_id: Sequel[:nodes][:id])
# Sequel < 4.39.0
join(:system_status, node_id: Sequel.expr(:nodes__id)) 

这应该生成

INNER JOIN system_status ON system_status.node_id = nodes.id