Die where
Methode gibt ein ActiveRecord::Relation
Objekt zurück, und dieses Objekt gibt selbst keine Datenbankabfrage aus. Hier kommt es darauf an, wo Sie dieses Objekt verwenden.
In der Konsole machen Sie wahrscheinlich Folgendes:
@person = Person.where(name: "Jason")
Und dann gibt blammo eine Datenbankabfrage aus und gibt ein Array von allen mit dem Namen Jason zurück. Ja, aktiver Rekord!
Aber dann machst du so etwas:
@person = Person.where(name: "Jason").where(age: 26)
Und dann gibt das eine andere Abfrage aus, aber diese ist für Leute, die Jason heißen und 26 Jahre alt sind. Aber es gibt nur eine Abfrage, also wohin ging die andere Abfrage?
Wie andere vorgeschlagen haben, geschieht dies, weil die where
Methode ein Proxy-Objekt zurückgibt. Es führt keine Abfrage durch und gibt ein Dataset zurück, es sei denn, es wird dazu aufgefordert.
Wenn Sie etwas in der Konsole ausführen , wird die überprüfte Version des Ergebnisses dessen ausgegeben, was auch immer Sie ausgeführt haben. Wenn Sie setzen 1
in der Konsole und drücken Sie die Eingabetaste, erhalten Sie 1
zurück , weil 1.inspect
ist 1
. Magie! Gleiches gilt für "1"
. Eine Vielzahl anderer Objekte nicht über eine inspect
Methode definiert und so Ruby des auf zurückfällt Object
das wieder etwas grässlich wie <Object#23adbf42560>
.
Auf jedem einzelnen ActiveRecord::Relation
Objekt ist die inspect
Methode definiert, sodass eine Abfrage ausgelöst wird. Wenn Sie die Abfrage in Ihre Konsole schreiben, ruft IRB inspect
den Rückgabewert dieser Abfrage auf und gibt etwas aus, das fast für Menschen lesbar ist, wie das Array, das Sie sehen würden.
Wenn Sie dies nur in einem Standard-Ruby-Skript ausgeben, wird keine Abfrage ausgeführt, bis das Objekt (via inspect
) inspiziert oder durch using iteriert each
wurde oder die to_a
Methode aufgerufen wurde.
Bis eines dieser drei Dinge passieren, können Sie Kette als viele where
Erklärungen, wie Sie mögen und dann , wenn Sie tun Anruf inspect
, to_a
oder each
auf sie, dann wird es schließlich die Abfrage auszuführen.
x = Person.where(..); @person = x.where(..)
, was identisch funktionieren soll. Es macht es einige Zeit später, also was ist der Auslöser? ;-)