Jestem nowy w ActiveRecord. Próbuję zoptymalizować zapytanie do bazy danych.
Mam Person
model z gender
kolumna. Osoby gender
może mieć jedną z trzech wartości: male
, female
, lub transgendered
. Chcę poznać liczbę osób każdej płci.
Obecnie robię to z trzema oddzielnymi zapytaniami do bazy danych.
numMale = Person.where(:gender => :male).count
numFemale = Person.where(:gender => :female).count
numTrans = Person.where(:gender => :transgendered).count
Czy można by to uczynić bardziej wydajnymi? Czy istnieje sposób na połączenie ich w jedno wywołanie bazy danych?
Odpowiedzi:
1 dla odpowiedzi № 1Możesz przeprowadzić grupowanie według zapytania, aby zagregować wszystkie dane:
Person.all(:group => "gender", :select => "gender, COUNT(*) as count")
Następnie możesz podzielić wartości i przypisać je do zmiennych.
2 dla odpowiedzi nr 2
Zapoznaj się z ActiveRecord :: Calculations. Składnia zależy od wersji Railsów.
# Rails 3.2
Person.count(:group => :gender)
# Rails 4
Person.group(:gender).count
count
zwraca Hash like { "male" => 12, "female" ... }
1 dla odpowiedzi nr 3
Person.select("gender,count(*)").where(:gender => [:male,:female,:transgendered]).group(:gender)
wróci
SELECT gender,count(*) FROM `people` WHERE `people`.`gender` IN ("male", "female", "transgendered") GROUP BY gender