Frage

Im Moment habe ich eine Tabelle namens Kampagnen, die viele Hits hat, wenn ich rufe sagen:

Campaign.find(30).hits

Welche dauert 4 Sekunden bzw. 4213 ms.
Wenn ich rufe Sie stattdessen:

campaign = Campaign.find(30)
campaign.hits.count

Ist es immer noch alle Treffer laden, dann zählen? Oder sieht es zähle ich und vermeidet alle Treffer Laden? (Welche ist derzeit als 300.000 Zeilen).
Ich versuche, eine intelligente Art und Weise, um herauszufinden, meine Treffer zu laden / zählen. Ich denke an eine Methode zu meinem Campaign.rb Modell hinzufügen, wie:

def self.total_hits
   find :first, :select => 'COUNT(id) as hits', :conditions => ["campaign_id = ?", self.id]
end

Ich weiß, dass Abfrage wird von der hits Tabelle nicht geladen werden, aber das ist nur ein Beispiel davon aus einer selbst erstellten Abfrage, apposed Ruby on Rails zu zählen dies zu tun für mich.
Würde dies memcache Abfrage mehr effecient sein? (Ich habe es läuft, aber scheint nicht besser / schneller zu sein / langsamer, nur die gleiche Geschwindigkeit.)

def self.hits
    Rails.cache.fetch("Campaign_Hits_#{self.campaign_id}", :expires_in => 40) {
      find(:first, :select => 'COUNT(id) as hits', :conditions => ["campaign_id = ?", self.campaign_id]).hits
    }
end

Irgendwelche Vorschläge wäre toll!

War es hilfreich?

Lösung

Wie wäre:

Campaign.find(30).hits.count

Sie können auch die folgenden in hit.rb (unter der Annahme einer Eins-zu-viele-Beziehung zwischen Kampagnen und Hits) betrachten hinzufügen.

belongs_to :campaign, :counter_cache => true

Sie müssen dann eine Spalte in der Tabelle campaigns genannt hits_count. Dadurch wird vermieden, hits trifft völlig, wenn Sie nur die Zählung zu bekommen.

Sie können die API für den vollständigen Überblick.

Andere Tipps

Meine Active könnte ein wenig rostig, sein so verzeiht mir, wenn ja, aber IIRC Campaign.find(30).hits mindestens zwei getrennte Abfragen. Wie macht Campaign.find(30, :include => [ :hits ]).hits? Das sollte eine einzelne Abfrage durchführen.

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