3

Ich habe gesucht, aber nicht in der Lage, die kurze Erklärung für den Unterschied zwischen ActiveRecord und ActiveRecord :: relation Objekt zu finden.Unterschied zwischen ActiveRecord und ActiveRecord :: Relation Objekte

Ich verstehe haben, dass Active das einzige Objekt ist durch so etwas wie

User.find(1) 

Und Active finden :: Relation ist das Array wie Objekt suchen nach etwas wie

User.where(id: 1) 

Ich suche die Unterschied zwischen ihnen in Bezug auf die Abfrage Ausführung oder tiefe Erklärung über sie, so dass es das gesamte Konzept dahinter klären wird.

Vielen Dank im Voraus!

Antwort

5

eine Instanz ActiveRecord::Base ist ein Objekt, das darstellt, eine bestimmte Zeile Ihrer Datenbank (oder möglicherweise in der Datenbank gespeichert).

Während eine Instanz von ActiveRecord::Relation eine Darstellung einer Abfrage ist, die für Ihre Datenbank ausgeführt werden kann (aber noch nicht ausgeführt wurde). Sobald Sie diese Abfrage durch Aufrufen von to_a, each, first usw. auf diesem Relation ausführen, wird eine einzelne Instanz oder ein Array von ActiveRecord::Base Instanzen zurückgegeben.

+0

dank @spickermann, wenn ich auf Schienen Konsole versuchen, dann zeigt es mir SQL-Abfrage wird bei aktiver Aufzeichnung Beziehung ausgeführt werden sollen, aber es sollte nicht sein, weil es sich um eine Darstellung ist. Kannst du das bitte erklären? – power

+0

@power: Es wird in der Konsole ausgeführt, weil die Konsole "inspect" auf diese Relation aufruft, um das Ergebnis auszugeben. Wenn Sie die Zeile so ändern, dass die Beziehung nicht zurückgegeben wird (z. B. "User.where (id: 10); nil"), werden Sie feststellen, dass die Abfrage nicht ausgeführt wird. Während 'User.find (10); "nil" würde die Abfrage immer noch ausführen. – spickermann

+0

Danke @spickermann, dafür. – power

1

bei der Aufnahme von Find-Methode verwenden und diesem Datensatz nicht in der Datenbank vorhanden, als Sie unter Fehler

User.find(10) 


User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 10]] ActiveRecord::RecordNotFound: Couldn't find User with 'id'=10 

erhalten werden, und wenn Sie Benutzer finden von wo Zustand und wenn der Benutzer nicht in Datenbank, als Sie nill Datensatz wie erhalten unter

User.where(id: 10) 


User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? [["id", 10]] 
=> #<ActiveRecord::Relation []> 

Es wird keinen Fehler geben

0

dies auf der folgenden Seite

http://guides.rubyonrails.org/active_record_querying.html

Rails verwendet Active als Standard ORM Alle erklärt, aber das gleiche gilt für Activerecord für sich allein.

Kurz gesagt: alle Abfragen, die mehrere Datensätze wie Bereiche, alle, wo und Joins ergeben ein ActiveRecord::Relation Objekt zurückgeben. Sie können diese zusammenketten, und nur wenn Sie eine Methode wie to_sql, zuerst, jedes, any, to_a, take, last usw. verwenden, wird die Abfrage ausgeführt.

Siehe auch http://api.rubyonrails.org/classes/ActiveRecord/Relation.html

+0

danke @peter, das wird helfen. – power

Verwandte Themen