2017-09-18 5 views
0

J'ai la déclaration MySQL suivante:Sequel JOIN et OÙ

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 

Je veux convertir ce qui précède Sequel

Je cette méthode qui est une réduire la version de la déclaration ci-dessus 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}>] 

maintenant, en utilisant les résultats de cette méthode, je veux faire un join avec une table appelée system_status, où les résultats de node.id = system_status.node_id.

Ensuite, je veux prendre les résultats de live_nodes et rejoindre à system_status où le résultat est égal à system_status.node_id, et je ne suis pas sûr de savoir comment le faire.

J'ai essayé les éléments suivants:

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

Mais reçu cette erreur

=> no implicit conversion of Symbol into Integer 

Je ne sais pas comment le résoudre .. Je ne pense pas non que je fais l'aliasing correctement

+0

est votre MySQL correct? Juste à partir de SQL brut, la partie jointe dans le SQL me manque. (Mais je ne connais pas MySQL, donc cela peut être fait par une syntaxe spéciale de MySQL). La jointure pourrait être construite avec 'DB [: a] .inner_join (: b,: node_id =>: id)' dans la suite. – knut

Répondre

0

Vous êtes extrêmement proche avec le join mais je crois qu'il devrait être

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

Pour plus explicite joint les éléments suivants devraient également travailler

# 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)) 

Cela devrait générer

INNER JOIN system_status ON system_status.node_id = nodes.id 
+0

Hm, il semble que j'ai eu l'erreur suivante lorsque j'ai utilisé 'Sequel [..]': 'méthode indéfinie '[]' pour Sequel: Module' – theGreenCabbage

+0

@theGreenCabbage hmm ce qui est étrange depuis le [Docs] (http://sequel.jeremyevans.net/rdoc/files/doc/cheat_sheet_rdoc.html#label-Joins) semble suggérer que c'est exactement ce qui devrait fonctionner et ['Sequel # []'] (https://github.com/jeremyevans /sequel/blob/master/lib/sequel/core.rb#L404) est un alias pour ['Sequel # expr'] (https://github.com/jeremyevans/sequel/blob/master/lib/sequel/sql .rb # L447) – engineersmnky

+0

On dirait que nous utilisons une ancienne version de Sequel parce que votre nouvelle solution a fonctionné - merci =)! – theGreenCabbage