Ruby on Rails: Wenn Sie gerne haben eine Verbindung geladen, die Bedingungen hat, wie kann man es bekommen, ohne die Datenbank wieder zu berühren?

StackOverflow https://stackoverflow.com/questions/2377495

  •  24-09-2019
  •  | 
  •  

Frage

Stellen Sie sich einen einfachen Fall wie folgt aus:

class Book
  has_many :chapters
end

Lassen Sie uns sagen in meinem Controller ich etwas tun, wie folgt aus:

book = Book.find(:first, 
                 :include => :chapters, 
                 :conditions => ['chapters.title = ?', "In the beginning"]

Lassen Sie uns jetzt sagen, ich will das Kapitel angezeigt werden soll. Wie kann ich die Kapitel in Rails adressieren, ohne erneut auf die Datenbank zu schlagen? Wenn ich etwas tun, wie folgt aus:

chapters = book.chapters.select{|chapter| chapter.title == "In the beginning"}

wird Rails rehit die Datenbank für alle Kapitel, so dass er sie scannen und dann noch schlimmer, haben sie in den Controller-Code erneut scannen?

Und es scheint wie etwas, dass Anwendungen wie diese finden:

chapters = Chapter.find_by_book_id_and_title(book.id, "In the beginning")

bewirkt, dass die Datenbank wieder selbst getroffen werden, wenn er das Kapitel bereits im Cache gespeichert.

War es hilfreich?

Lösung

Mit: include =>: Kapitel holen sollte es in insgesamt 2 Abfragen nach der AR Verband API . Von dort aus sollten Sie in der Lage sein, die Daten zu durchqueren, ohne erneut auf die Datenbank zu berühren. Es ist einfach eine Frage der zu diesem Zeitpunkt durch book.chapters Looping, werden alle Daten auf der Hand sein sollte.

Beachten Sie, dass Active nur speichert die letzte Abfrage, so durch eine andere Abfrage wie Chapter.find_by_book_id_and_title tun ( ‚title‘) Ihre vorherigen Book.chapters Abfrage wird nicht zwischengespeichert werden (weil es ganz anders ist).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top