Ich bin neu in ActiveRecord. Ich versuche, eine Datenbankabfrage zu optimieren.
Ich habe ein Person
Modell mit gender
Säule. Von einer Person gender
kann einen von drei Werten haben: male
, female
, oder transgendered
. Ich möchte die Anzahl der Personen jedes Geschlechts kennen.
Ich mache dies derzeit mit drei separaten Datenbankabfragen.
numMale = Person.where(:gender => :male).count
numFemale = Person.where(:gender => :female).count
numTrans = Person.where(:gender => :transgendered).count
Könnten diese effizienter gestaltet werden? Gibt es eine Möglichkeit, sie in einem einzigen Datenbankaufruf zu kombinieren?
Antworten:
1 für die Antwort № 1Sie können eine Gruppe nach Abfrage erstellen, um alle Daten zu aggregieren:
Person.all(:group => "gender", :select => "gender, COUNT(*) as count")
Dann können Sie die Werte aufteilen und Ihren Variablen zuweisen.
2 für die Antwort № 2
Schauen Sie sich ActiveRecord :: Calculations an. Die Syntax hängt von Ihrer Rails-Version ab.
# Rails 3.2
Person.count(:group => :gender)
# Rails 4
Person.group(:gender).count
count
Liefert einen Hash wie { "male" => 12, "female" ... }
1 für die Antwort № 3
Person.select("gender,count(*)").where(:gender => [:male,:female,:transgendered]).group(:gender)
würde zurückkehren
SELECT gender,count(*) FROM `people` WHERE `people`.`gender` IN ("male", "female", "transgendered") GROUP BY gender