2016-12-02 4 views
3

Angenommen, ich habe eine ActiveRecord-Klasse "Benutzer".Woher weiß ich, dass Rails Activetrecord-Klassenattribute geladen/zwischengespeichert hat?

Ich realisiere das erste Mal, dass ich es benutze über User.new, macht Rails einen Aufruf an die Datenbank, um die tatsächlichen Attribute von Benutzer aus der Tabelle Benutzer zu erhalten. Weitere Male wird es zwischengespeichert und erfordert keinen Datenbankaufruf.

Das ist in Ordnung .. und direkt in einem einzigen Thread.

Angenommen, ich habe mehrere Threads in einem einzigen Prozess ausgeführt. Der erste Thread, der User.new aufruft (oder alles, was den Benutzer betrifft, wie zum Beispiel einen zu finden), sucht die Attribute in der Datenbank. Die nachfolgenden werden sie zwischengespeichert haben.

Gibt es eine Möglichkeit zu überprüfen, ob die ActiveRecord-Attribute im Cache gespeichert sind oder nicht?

Ich möchte nicht immer eine Datenbankverbindung über ActiveRecord :: Base.connection_pool.with_connection auschecken, wenn ich User.new anrufe, wenn ich nicht vorhabe, die Datenbankverbindung zu verwenden - Ja, nicht einmal Speichern Sie es.

u = nil 

ActiveRecord::Base.connection_pool.with_connection do # I don't want to checkout a conn if User attributes are cached. 
    u = User.new 
end 

#manipulation of u. but u.save NEVER ever gets called. 

ich nicht vollständig erklärt meine ganze Argumentation, aber in einem Wort zu beantworten, weil tun würden die Leute so ablenken: es ist kompliziert. Hier ist ein Artikel, wenn interessiert, das ist ähnlich zu meinem Problem: https://bibwild.wordpress.com/2014/07/17/activerecord-concurrency-in-rails4-avoid-leaked-connections/ Ich möchte nicht grundsätzlich eine Datenbankverbindung auschecken, aber immer noch User.new aufrufen, um damit zu manipulieren, aber nicht speichern.

Antwort

0

Ja und nein. Der eigentliche Schema-Cache kann unter ActiveRecord::Base.connection.schema_cache gefunden werden, aber der Aufruf von connection bewirkt, dass er geöffnet wird. Wenn ActiveRecord::Base.connected? wenn false, können Sie davon ausgehen, dass kein Schema-Cache vorhanden ist, und wenn es wahr ist, müssten Sie die @columns -Ivar Ihrer schema_cache -Instanz überprüfen.

Dies ist Hacky, weil das Active Record-Muster annimmt, dass Objekte mit einer Datenquelle verbunden sind. Wenn Sie Domänenobjekte benötigen, die von Ihrer DB unabhängig sind, würde ich empfehlen, sie als POROs zu schreiben, indem Sie Virtus + ActiveModel::Validation oder dry-struct usw.

verwenden
Verwandte Themen