2015-07-08 5 views
7

Ich möchte einen bestimmten Datensatz innerhalb eines ActiveRecord::Relation Objekts finden, damit ich das Attribut dieses Datensatzes greifen kann.Rails Finden Sie einen Datensatz in ActiveRecord :: Relation Object ohne erneut Datenbank abzufragen

Das unten funktioniert, aber das Problem ist, dass es die Datenbank wieder mit dieser find_by Aussage schlägt. Es sollte nicht nötig sein. Es sollte eine Möglichkeit für Schienen geben, das Objekt innerhalb des Objekts ActiveRecord::Relation zu finden, anstatt die Datenbank erneut abfragen zu müssen.

#returns an ActiveRecord::Relation object 
@blogs = Blog.all 

# Search for the blog within that ActiveRecord::Relation object, NOT the database 
@blogs.find_by(id: 1).title #do this statement but don't hit the database again 

Antwort

11

Sobald die Realtion geladen wurde, können Sie reguläre Array-Methoden verwenden. find ist eigentlich sehr interessante Methode hier - wenn Block angegeben ist, wird es auf die Beziehung Ziel delegiert worden sein:

@blogs.find {|b| b.id == 1} 
8

Wenn Sie find_by nennen, es geht um die Datenbank zu treffen.

Das relation-Objekt wird zum verzögerten Laden der db-Ergebnisse verwendet.

Sobald sie für den Aufruf all geladen sind, können Sie im resultierenden Array suchen.

Wenn Sie in Ihrem Rubin-Prozess innerhalb der Ergebnisse bereits im Speicher suchen möchten, sollten Sie innerhalb des Arrays mit find oder detect suchen (die das gleiche tun). Ich neige dazu, detect zu verwenden, so ist es klar, dass es nicht auf die Datenbank trifft:

@blogs.detect { |b| b.id == 1 } 

http://ruby-doc.org/core-2.2.0/Enumerable.html#method-i-detect

0

Sie können immer where-Klausel verwenden. Zum Beispiel

@blogs.where(id: 1).first.reload 

Um (und neu geladen aus der Datenbank) @blog Instanz mit ID 1. Und denken Sie daran, dass diese Abfrage schnell sein wird, effizient und sicher (falls Sie params[:id] statt harter hinzufügen möchten -codierte ID.

Verwandte Themen