2017-12-15 3 views
2

Was ich tun möchte, zählt alle Objekte in der Datenbank. Ich begann mit etwas wie folgt aus:So zählen Sie alle Objekte in der Datenbank über Active Record

p ["TOTAL COUNT", ApplicationRecord.subclasses.sum(&:count)]

Aber beim Experimentieren fand ich ...

[5] pry(main)> ApplicationRecord.subclasses.count => 6

Was ich viel mehr als das zurückerwartet. Ich kann die Unterklassen untersuchen und feststellen, dass einige fehlen.

Dann fand ich ....

[8] pry(main)> ActiveRecord::Base.descendants.count => 10

die ein paar mehr hinzugefügt. Wieder kann ich sie einzeln untersuchen, und ich bemerkte, dass einige fehlten. Hier ist ein Beispiel für einen, der fehlt ...

Wie kann ich sicherstellen, dass diese auch enthalten sind?

+0

Sorry, warum brauchen Sie das? Vielleicht, wenn Sie den vollständigen Geschäftsfall beschreiben, hilft es, es mit einer normalen Lösung zu lösen. Weil du fragst, ist ein bisschen seltsam. –

+0

Also, was meinst du mit "alle Objekte"? Alle Domains (AR-Klassen) oder alle Zeilen in allen Tabellen Ihrer Datenbank (alle AR-Instanses)? –

+0

@MaxVinogradov Ich suche nach allen AR-Instanzen oder Zeilen in der Tabelle. Ich habe eine Gurkensuite, die ein absolutes Durcheinander ist und ich vermute, dass es sehr langsam ist, weil man Fabriken benutzt, die viel mehr Objekte als nötig erschaffen. Ich möchte die schlimmsten Täter der Objekterstellung finden und sehen, ob ich diese Tests zuerst beheben kann. Ist das sinnvoll? –

Antwort

1

Dies ist nicht die Antwort auf Ihre Frage, sondern ein Vorschlag für Sie, um Ihre Testsuite zu beschleunigen.

Sie können einige Caching mit factory, so etwas tun:

class RecordCache 
    def self.[](key) 
    all.fetch(key) 
    end 

    def self.register(name, object) 
    all[name] = object 
    end 

    def self.setup! 
    register :admin_user, FactoryGirl.create(:user, is_admin: true) 
    end 

    private 

    def all 
    @all ||= {} 
    end 
end 

Dann brauchen Sie RecordCache.setup! in Ihrem test_helper.rb anrufen, bevor Sie Ihre Testsuite ausgeführt wird.

Danach werden Sie in der Lage sein, dies zu fragen RecordCache die Instanz zu schaffen, anstatt, factory es wieder schaffen:

FactoryGirl.define do 
    factory :post do 
    # title content etc. 
    user { RecordCache[:admin_user] } 
    end 
end 

Damit jedes Mal, wenn FactoryGirl.create(:post) nennen, ist es nicht einen anderen Benutzer zu erstellen. Dies bringt einige Bedenken mit sich, da der gleiche Datensatz über die App zwischengespeichert wird und nicht geändert werden sollte. Aber wenn Sie einen bestimmten Benutzer für einen bestimmten Kontext möchten, können Sie immer noch tun:

FactoryGirl.create(:post, user: FactoryGirl.create(:user, :super_admin))