2015-07-08 8 views
7

Chcę znaleźć określony rekord wewnątrz obiektu ActiveRecord::Relation, aby pobrać atrybut tego rekordu.Szyny Znajdź rekord wewnątrz obiektu ActiveRecord :: Obiekt relacji bez ponownego zapytania do bazy danych

Poniższe działa, ale problem polega na tym, że ponownie uderza w bazę danych za pomocą tego oświadczenia find_by. Nie powinno tak być. Powinien istnieć sposób na szyny, aby znaleźć ten obiekt wewnątrz obiektu ActiveRecord::Relation, a nie na konieczności ponownego wysyłania zapytań do bazy danych.

#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 

Odpowiedz

11

Po załadowaniu realt można użyć zwykłych metod tablicowych. find jest rzeczywiście bardzo interesująca metoda tutaj - jeśli blok jest określona, ​​to zostanie przekazane do docelowej relacji:

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

Po wywołaniu find_by, to będzie hit bazy danych.

Obiekt relacji służy do leniwego ładowania wyników db.

Po załadowaniu do wywołania all można następnie wyszukiwać w wynikowej tablicy.

Jeśli chcesz zajrzeć do wyników już znajdujących się w pamięci w procesie rublicznym, powinieneś zajrzeć do tablicy używając find lub (która robi to samo). I mają tendencję do używania detect, więc oczywiste jest, że nie trafia do bazy danych:

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

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

0

zawsze można użyć where klauzuli. Na przykład

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

Aby dostać (i przeładować z bazy danych) @blog przykład z ID 1. I pamiętać, że ta kwerenda będzie szybki, wydajny i bezpieczny (w przypadku, gdy chcesz dodać params[:id] zamiast ciężko kodowany identyfikator:

Powiązane problemy