2017-09-18 9 views
0

私は、次のMySQLステートメントを持っている:続編はJOINとWHERE

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}>] 

は今、このメソッドの結果を使用して、私はsystem_statusと呼ばれるテーブル、node.id = system_status.node_idの結果とjoinをしたいです。

次に、live_nodesの結果を受け取り、system_statusに参加します。結果はsystem_status.node_idに等しく、私はそれを行う方法がわかりません。

私は次のことを試してみました:..私はまた私が正しく

+0

を生成する必要がありますあなたのMySQLが正しいですか?生のSQLから、私はSQLの結合部分を見逃しています。 (しかし、私はMySQLを知らないので、MySQLの特別な構文があります)。結合は 'DB [:a] .inner_join(:b、:node_id =>:id)'で続けることができます。 – knut

答えて

0
エイリアシングをやっているとは思わない

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 

ないそれを修正する方法がわからこのエラーを受け取りました

あなたはjoinと非常に近いですが、私はそれがすべきだと信じています

より明示的には、以下に合流するため

# 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 
+0

Hm、Sequel:Module'のために 'Sequel [..]': '未定義メソッド '[]'を使用したときに次のようなエラーが発生したようです:Module' – theGreenCabbage

+0

@theGreenCabbage hmm [Docs](http: /sequel.jeremyevans.net/rdoc/files/doc/cheat_sheet_rdoc.html#label-Joins)は、正確にどのように動作し、['Sequel#[]'](https://github.com/jeremyevans) /sequel/blob/master/lib/sequel/core.rb#L404)は['Sequel#expr']のエイリアスです(https://github.com/jeremyevans/sequel/blob/master/lib/sequel/sql .rb#L447) – engineersmnky

+0

あなたの新しい解決策が働いたため、古いバージョンのSequelを使用しているようです。 – theGreenCabbage