2017-12-05 4 views
0

Im Moment habe ich ein relativ komplexes Stück Code (es ist nicht so komplex), die ichein komplexe Änderung kommt in einen Sequel Verein

durch Sequel Assoziationen vereinfachen möchte
MyApp::Model::Node.where { last_heartbeat > Time.now - HEARTBEAT_TIMEOUT.seconds }.join(:system_status, node_id: Sequel.expr(:node__id)) 

ziemlich böse, diese Aussage.

So würde ich gerne eine Sache, ziemlich viel erreichen: vereinfachen Sie die obige Aussage, indem Sie die Verbindung durch eine Verbindung in meinem SystemStatus Modell ersetzen.

erklären Lassen Sie mich die oben kommen:

Ich habe zwei Tabellen Node und SystemStatus. Der Vergleich last_heartbeat > Time.now - HEARTBEAT_TIMEOUT.seconds gibt mir im Wesentlichen alle "lebenden Knoten" in meiner Anwendung (meine Anwendung ist gruppiert, was bedeutet, dass der Benutzer mehrere Instanzen gleichzeitig erzeugen kann).

So dass Chaos einer Aussage gibt mir "alle Status meiner Live-Knoten", die von system_status.node_id bis node.id verbunden ist.

Also das ich begann, durch die Einrichtung aus meiner 00.59 Beziehung in SystemStatus - dies die Zuordnung zu dem node Tisch setzt

one_to_one :node 

Als nächstes musste ich es von einem bestimmten Schlüssel node.id anschließen, weil es keine ist einfach beitreten

one_to_one :node, key: :id 

Aber meine Frage ist:

  1. Wie mache ich den Rest dieses Vereins

  2. Soll ich den Verein in Node durchführen zu SystemStatus Gegensatz? Es scheint, ich könnte einfach tun one_to_one :system_status und muss nicht einen Schlüssel angeben .. Die obige komplexe Join befindet sich in der node Modell sowieso.

Antwort

0

Wenn Sie den Verein in SystemStatus haben, müssen Sie many_to_one verwenden, da die Fremdschlüssel in der Tabelle dieses Modell ist, nicht die Tabelle des zugehörigen Modells. Sie können einfach übertragen Sie Ihre wo Bedingung an den Verein einen Block mit:

SystemStatus.many_to_one :live_node, class: :Node, key: :node_id do |ds| 
    ds.where{last_heartbeat > Time.now - HEARTBEAT_TIMEOUT.seconds} 
end 
+0

Ich weiß nicht, warum, aber wenn ich die obige Aussage versuchen, es zu sagen 'nicht definierte Methode‚NODE_ID‘für # '. Scheint zu versuchen, 'node_id' als eine Methode zu interpretieren – theGreenCabbage