Die Methode where
gibt ein Objekt ActiveRecord::Relation
zurück, und dieses Objekt gibt selbst keine Datenbankabfrage aus. Es ist wo Sie dieses Objekt verwenden, das zählt.
in der Konsole sind Sie wahrscheinlich dies zu tun:
@person = Person.where(name: "Jason")
Und dann blammo es eine Datenbankabfrage ausgibt und zurückgibt, was eine Reihe von jeder zu sein scheint Jason genannt. Yay, aktive Aufzeichnung!
Aber dann tun Sie etwas wie folgt aus:
@person = Person.where(name: "Jason").where(age: 26)
Und dann die andere Abfrage ausgibt, aber für Menschen ein, die Jason genannt werden, die 26 sind, aber es ist nur eine Abfrage ausgeben, also wo würde die andere Abfrage gehen?
Wie andere vorgeschlagen haben, dies geschieht, weil die where
Methode einen Proxy-Objekt zurückgibt. Es führt keine Abfrage durch und gibt ein Dataset nur zurück, wenn es dazu aufgefordert wird.
Wenn Sie irgendetwas in der Konsole ausführen, wird es die überprüfte Version des Ergebnisses von was auch immer Sie ausgeführt wird, ausgeben. Wenn Sie 1
in die Konsole eingeben und die Eingabetaste drücken, erhalten Sie 1
zurück, da 1.inspect
1
ist. Zauber! Gleiches gilt für "1"
. Eine Vielzahl von anderen Objets haben keine inspect
Methode definiert und so Ruby fällt zurück auf die auf Object
, die etwas zurückgibt ghastly wie <Object#23adbf42560>
.
Jedes einzelne ActiveRecord::Relation
Objekt hat die inspect
Methode definiert, so dass es eine Abfrage verursacht. Wenn Sie die Abfrage in Ihre Konsole schreiben, ruft IRB inspect
auf dem Rückgabewert von dieser Abfrage auf und gibt etwas fast menschenlesbares aus, wie das Array, das Sie sehen würden.
Wenn Sie diese in einem Standard-Ruby-Skript nur wurden die Ausgabe, dann würde keine Abfrage ausgeführt werden, bis das Objekt (via inspect
) oder wurde durch den Einsatz von each
iteriert, oder hatte die to_a
Methode auf sie genannt wurde inspiziert.
Bis eines dieser drei Dinge passieren, können Sie Kette so viele where
Aussagen auf, wie Sie mögen und dann, wenn Sie inspect
Telefonieren, to_a
oder each
drauf, dann wird es schließlich die Abfrage auszuführen.
Es tut es nicht in der letzten Methode. Das kann man nicht wissen. Betrachte 'x = Person.where (..); @person = x.where (..) ', die identisch funktionieren sollte. Es macht es irgendwann später, also was ist der Auslöser? ;-) –