Rails: gibt Datensätze zurück, für die keine Beziehung existiert

7

Wie kann ich mithilfe eines aktiven Datensatzes die Ergebnisse für ein Modell zurückgeben, wenn sie nicht anderswo in einer bestimmten Beziehung vorhanden sind. Angenommen, ich habe ein Recipe -Modell, das zu categories gehört (über eine category_recipes Join-Tabelle).

Im Grunde genommen habe ich eine Rake-Aufgabe, die jedes Rezept und seine Beschreibung durchschaut und versucht, in eine Kategorie einzuordnen, aber die Aufgabe dauert sehr lange und ich muss sie regelmäßig ausführen, also nur ich Ich möchte es ausführen, wenn das Recipe in Frage nicht bereits kategorisiert wurde und ich lieber keine überflüssige Spalte wie categorized hinzufügen würde, also gibt es eine Möglichkeit, nur die Rezepte abzurufen, die nicht in der Tabelle beitreten. Irgendwelche Gedanken?

    
JP Silvashy 24.01.2011, 20:40
quelle

5 Antworten

14

Sie können diese Abfrage mit einem LEFT OUTER JOIN lösen:

%Vor%     
Jason Weathered 24.01.2011, 21:42
quelle
10

Ich musste das heute selbst lösen und denke, dass dies den Trick bewirken wird:

%Vor%     
user486646 18.05.2011 23:05
quelle
3

Sie könnten dies vielleicht mit einer SQL-Auswahl tun.

%Vor%

Die genaue Syntax hängt von Ihrer Datenbank ab.

    
Jakob Borg 24.01.2011 20:43
quelle
2

Sie können dies mit der Methode pluck für Recipe und CategoryReceipe tun.

Schritte:

  • r = Receipe.pluck (: id)

      

    # stellt ein Array aller IDs innerhalb des Modells bereit. Bsp .: [1, 2, 3, 4,   5 ...]

  • cr = CategoryRecipe.pluck (: rezept_id)

      

    # liefert ein Array mit allen IDs aus rezept_id-Spalte, die vorhanden sind.

  • Rest = r - cr

      

    #nimmt die beiden Arrays ID und Rezept_ID und berechnet ein neues Array. Dieses neue Array enthält nur die IDs, die in CategoryRecipe nicht vorhanden sind.

Sie können dann Ihre Operation für dieses neue Array ausführen: Rezept.wo (id: Rest) .count

  

# gibt Ihnen die Anzahl der Datensätze, die aktualisiert werden müssen

Ich bevorzuge diese Methode, weil Sie es in eine separate Funktion umwandeln können, die Sie verwenden können, wenn Sie mehrere Zuordnungen auswerten, ohne Code umzuschreiben. Dies ist auch extrem einfach zu testen.

    
Ankit Patel 03.02.2016 23:32
quelle
1

Ich habe es nicht getestet, aber Sie können versuchen

%Vor%     
edgerunner 24.01.2011 21:01
quelle

Tags und Links