2012-04-15 7 views
3

Ich habe mehrere Modelle, die ich durchsuchen möchte, so dass die Ergebnisse Ergebnisse von allen Modellen enthalten können. Nehmen wir an, ich möchte nach "Stiefeln" suchen, und ich möchte, dass es sowohl die Stiefel-Kategorie als auch die Händler zurückgibt, die Stiefel und echte Stiefel verkaufen. Ich habe ein Modell für die Kategorien, Verkäufer, sowie die Produkte.Welche Schienen Beziehung suche ich hier?

Ich möchte in diesem Fall keine Join-Tabellen erstellen, da jedes Objekt einen Join erfordert und dies nicht notwendig ist, weil alle Objekte in die Suche einbezogen werden sollen.

Ich denke an die Verwendung der Ransack-Juwel, aber ich denke nicht, dass dies für die Frage wichtig ist, denn es wäre das gleiche, unabhängig von meiner Suche Verfahren.

Vielleicht macht eine komponierte Beziehung Sinn, aber ich kann meinen Kopf nicht so richtig einwickeln.

Antwort

1

Angenommen, Ihre Productbelongs_to ein Vendor und belongs_to ein Category hier Ihre Anfrage:

string_to_search = 'boots' 
@products = Product.where("title LIKE ?", "%#{string_to_search}%").includes(:vendor, :category).all 

Es wird holen alle Produkte mit den erforderlichen Titel Inhalt zusammen mit allen ihren Kategorien und Lieferanten. Sie können durch Ihre resultierenden Daten ohne zusätzliche Abfragen zum Abrufen von Kategorie/Lieferant für ein bestimmtes Produkt durchlaufen.

Wenn Sie benötigen, sagen wir, extrahieren Sie die Liste der Anbieter aus dem @products - nur verwenden:

@vendors = @products.map &:vendor 
+0

Das ist eine glatte Lösung, meine Antwort ging davon aus, dass Ihre Suche nach mehreren Attributen erfolgt, d. H. Im Titel oder einer Beschreibung im Produkt oder einem Beschreibungsattribut im Anbieter usw.Ich vermisste deinen Punkt über das Plündern von Juwelen, und ich weiß es nicht, aber es hört sich an, als wäre Ransack in Kombination mit dieser Antwort einfacher als UNIONS, die von ActiveModel verzerrt wurde. – RadBrad

+0

Dies funktioniert nicht, wenn ein Kategoriename oder eine Anbietereigenschaft (Name, zu verkaufende Produkte usw.) mit der Abfrage übereinstimmt. Ich brauche die Ergebnisse, um Lieferanten, Kategorien und Produkte einzuschließen, da die Ergebnismenge unabhängig vom Typ übereinstimmende Objekte enthalten sollte. – Eric

+0

In diesem Fall brauchen Sie nur 3 Abfragen: eine pro Modell, nicht wahr? – jdoe

0

Ich denke, Sie müssen den UNION-Operator in einer SQL-Abfrage verwenden, die Sie von Hand erstellen. Sie könnten ein Pseudomodell mit ActiveModel erstellen, es könnte als Aggregator agieren, die Suchergebnisse von den realen Modellen sammeln und eine ActiveRecord-ähnliche Oberfläche für Ihre Abfragen präsentieren.

+0

Ich bin geneigt, die SQL manuelle Weg zu vermeiden, da ich viele RoR Leckereien verlieren werde. Wie würde ich bei der Beschreibung ein Aggregationsmodell erstellen? – Eric

+0

Meine Antwort war ONE Lösung, Sie würden manuelle SQL UNIONs verwenden und sie in ein ActiveModel umwandeln, um die RoR Goodies wiederzuerlangen. Chat mich und ich kann dich durch es gehen – RadBrad

+0

Oh, ich verstehe. Ich sehe deine Chat-Informationen nicht. Wie kann ich eine Verbindung herstellen? – Eric

Verwandte Themen