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?
Sie können diese Abfrage mit einem LEFT OUTER JOIN
lösen:
Ich musste das heute selbst lösen und denke, dass dies den Trick bewirken wird:
%Vor%Sie könnten dies vielleicht mit einer SQL-Auswahl tun.
%Vor%Die genaue Syntax hängt von Ihrer Datenbank ab.
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.
Tags und Links ruby-on-rails activerecord