0

Ich habe eine Implementierung für eine Diagrammknotenklasse, die als gerichteter azyklischer Graph fungieren soll.So geben Sie den Primärschlüssel in einer Durchgangsverknüpfung an

Die Verbände grob sind als

class Node 
    has_many :edges 

    has_many :parents, 
      :foreign_key => 'parent_id', 
      :through => :edge 

    has_many :parent_edges, 
      :foreign_key => 'child_id', 
      :class_name => 'Edge', 
      :dependent => :destroy 

    # similar for children 
end 

class Edge 
    belongs_to :parent, 
      :class_name => 'Node' 

    # similar for child 

    has_many :edge_properties 
end 

folgt Wenn ich versuche, eine Beziehung von Elternknoten zu greifen, verwendet die erzeugte Abfrage noch node_id als Primärschlüssel.

SELECT `nodes`.* 
FROM `nodes` 
     INNER JOIN `edges` 
       ON `nodes`.`id` = 
        `edges`.`parent_id` 
WHERE `edges`.`node_id` = 16    # where clause uses node_id, should be child_id 
ORDER BY `nodes`.`name` ASC 

Was kann ich diese Abfrage ändern child_id in der where-Klausel zu verwenden?

+0

Haben Sie versucht, 'zu setzen: foreign_key =>: child_id' in the Edge' belongs_to: parent' Linie? Außerdem: Können Sie uns den Rails-Code zeigen, der diese SQL generiert? –

Antwort

0

Richtige Lösung (auch TIL: durch Wahl einer anderen Verein angeben)

has_many :parent_edges, 
      :foreign_key => 'child_id', 
      :class_name => 'Edge', 
      :dependent => :destroy 

has_many :parents, 
      :source => 'parent', 
      :through => :parent_edges # using another association 
Verwandte Themen