2016-06-10 11 views
1

Beim Angeben eines model_class von false wird erwartet, dass die Verbindung von diesem Knoten zu einem anderen eine andere Klasse von Knoten sein kann.Neo4jrb: Enumerator für model_class: false

Gibt es eine gegenseitige enumerator, so dass wir so etwas wie aufrufen können:

ActiveNodes.all

, wenn der Benutzer eine Auswahl von Knoten geben zu wählen?

Hinweis (und Warnung an alle, die darüber nachdenken): Die Suche nach allen Knoten würde überhaupt nicht skalieren.

Antwort

1

Wenn Sie einen guten Anwendungsfall haben, würden wir es sicherlich für etwas leichter halten. Das Problem ist jedoch, dass es an diesem Punkt keine Assoziationen geben würde, da kein Modell involviert ist. Sie könnten nur die Query API an diesem Punkt verwenden möchten:

Neo4j::Session.current.query.match(:n).where(n: {foo: 'bar'}).etc... 

Die Dokumentation für alle Methoden ist hier:

http://neo4jrb.readthedocs.io/en/7.0.x/QueryClauseMethods.html

EDIT:

Bearbeiten der Post basierend auf Ihrem Kommentar, weil in einem Kommentar nicht genug Platz ist;)

Ihr Beispiel ist, dass Sie eine Product haben und Sie möchten andere Modelle finden, die mit dem gleichen Beziehungstyp verknüpft sind. Hier ist, was ich tun könnte:

class Product 
    include Neo4j::ActiveNode 

    has_one :out, :file, type: :RELATED_FILE, model_class: %i(ProductImage ProductVideo ProductPDF) 

# optionally 
has_one :out, :image_file, type: :RELATED_FILE, model_class: :ProductImage 
has_one :out, :video_file, type: :RELATED_FILE, model_class: :ProductVideo 
has_one :out, :pdf_file, type: :RELATED_FILE, model_class: :ProductPDF 
end 

Diese auch has_many und Arbeit genauso geändert werden könnte, wenn es die Möglichkeit, mehr als einen verbunden.

Dann sollten Sie in der Lage sein, einen select-Tag in der Ansicht zu erzeugen, die alle Optionen haben und welche die ID (s) nach unten an die Steuerung über params übergeben und dann könnte man einfach tun:

Product.create(name: 'or whatever props you have', file_id: params[:file_id]) 

Wenn die Zuordnung has_many ist, können Sie stattdessen file_ids: params[:file_ids] tun.

Das könnte dir auch damit zusammenhängende Modelle aus einer einzigen Klasse wie folgt erben betrachten:

class File 
    include Neo4j::ActiveNode 
end 

class ProductImage < File 
    # No need to `include Neo4j::ActiveNode` 
end 

Dann Sie das Array von Modellen tun könnte, wie ich oben vorgeschlagen, oder Sie können einfach tun:

class Product 
    include Neo4j::ActiveNode 

    has_one :out, :file, type: :RELATED_FILE 
end 

model_class: :File wird basierend auf dem Namen der Assoziation angenommen. Wenn Sie has_many hätten, dann wäre Ihr Verbindungsname :files und es wird weiterhin model_class: :File angenommen.

Seien Sie sich bewusst sein, dass, wenn Sie diese Knoten für Ihre zugehörigen Modelle tun (ProductImage, ProductVideo und ProductPDF) würden alle auch wegen der Erbschaft der File Label.

Als separater Modellvorschlag hätte ich wahrscheinlich nur ein Modell Image (zum Beispiel) anstatt ProductImage, damit das Modell möglicherweise wiederverwendet werden könnte.

+0

Ich kann mir keinen allgemeinen Anwendungsfall vorstellen, bei dem die Suche nach allen Knoten von Vorteil wäre. Der größte allgemeine Anwendungsfall in dieser Zeile ist der gleiche Beziehungstyp zu verschiedenen Labels. Vielleicht gibt es einen besseren Weg, damit umzugehen? – joshfindit

+0

Meinst du wie auf einem Verein? –

+0

Hier ist ein Beispiel: Ich habe ein Produkt, das mit jeder Art von Datei verknüpft werden kann. Für die Rails-Integrität hat jede Dateigruppe ihre eigene Klasse: 'ProductImage',' ProductVideo', 'ProductPDF' und so weiter. Sie haben alle den gleichen Beziehungstyp: '[: RELATED_FILE]', und ich möchte, dass der Benutzer jeden Dateityp in einem einzigen Feld auswählen kann. In Cypher ist das einfach. In Neo4j; gibt es einen Weg? – joshfindit

Verwandte Themen