2010-12-14 26 views
5

Mam app szyny z wielu kolejnych kawałków kodu:Jaki jest właściwy sposób liczenia w Railsach?

Our active community of <%= Account.find_all_by_admin(false).count %> 

Moje pytanie brzmi czy to jest dobry sposób, żeby zrobić liczy na widoki? Wydaje się, że tak "brudny" jest bardziej sztywny sposób, żeby to się liczyło? Myślę o nazwanych teleskopach, ale chcę mieć pewność, że tego typu rzeczy nie będą miały większego wpływu na wydajność.

Dziękuję,

Odpowiedz

6

Polecam, aby uniknąć bezpośredniego dostępu do bazy danych w moich szablonach, ponieważ wtedy tracisz trochę elastyczności, jeśli chodzi o buforowanie.

Spróbuj przygotować wszystkie dane potrzebne do renderowania w działaniu, a następnie użyj znaczących zmiennych instancji, takich jak @number_of_accounts lub @accounts.count.

To uczyni swoje poglądy czystsze i łatwiejsze do debugowania, a także nieco bardziej DRY jeśli czyni działania w różnych formatach (HTML, JSON, itp)

, jak ty dostać swoje numery - nie robi” t naprawdę znaczenia, że ​​wiele, po prostu odejść od find_ * metody do określania zakresu i napisać kod czytelny

+0

To była odpowiedź Szukałem, bo wiem, jak to zrobić, po prostu chciałem znać NAJLEPSZĄ drogę, aby to zrobić. – Gotjosh

2

Nazwany zakres nie powinien mieć wpływu na wydajność

scope :not_admin, where(:admin => false) 

to możesz mieć Account.not_admin.count

Zmieniano na komentarz DGM za: Aby sprawdzić wygenerowany SQL w konsola, porównaj Account.not_admin.to_sql z Account.find_all_by_admin(false).to_sql

+0

'Account.not_admin.count.to_sql' jest błędem, przynajmniej w szynach 3, ponieważ liczba zwraca Fixnum. – DGM

+0

Ups. Nie można tu przetestować, ale musisz być poprawny. Jednak konta Account.not_admin.to_sql i Account.find_all_by_admin (false) .to_sql powinny być równoważne. –

1

W szynach 3 proste połączenie zliczania problemów proste co unt prośba:

Contact.count 

został rozwiązany jak:

SELECT COUNT(*) AS count_id FROM "contacts" 

za znaleźć wszystko od nazwy pola rozwiąże jak:

Contact.find_all_by_country("Canada") 

SELECT "contacts".* FROM "contacts" WHERE ("contacts"."country" = 'Canada') 

Polecam indeksowania kolumny administratora dla szybszych wyszukiwań i to można przetłumaczyć na nazwany zakres, ale samo to tylko predefiniuje zapytanie, a nie go zoptymalizuje.

Ważne jest, aby pamiętać, że jeśli wyda

Contact.find_all_by_country("Canada").count 

count jest sposobem na klasy Array i faktycznie nie wystawi liczyć na bazie:

Contact.find_all_by_country("Canada").count 

SELECT "contacts".* FROM "contacts" WHERE ("contacts"."country" = 'Canada') 
+0

również zajrzyj do tego artykułu: http://www.railway.at/2010/03/09/named-scopes-are-dead/ –

+0

+1 dla Kanady, eh ;-) – Ted

7

don” t potrzebować zakresu nazw, aby wykonać liczenie.

Account.where(:admin => false).count 

Ale nazwane lunety to doskonały sposób na ulepszenie kodu.

Nazwane zakresy nie mają zauważalnego wpływu na wydajność aplikacji.

0

można użyć następującego zapytania zamiast Account.where(:admin => false).count

Account.select(:id).where(:admin => false).count 

wystarczy wybrać jedną kolumnę, zamiast wybierania wszystkich. To generuje następujące zapytanie i to szybciej niż poprzedni:

SELECT COUNT("accounts"."id") FROM "accounts" where admin = false 
Powiązane problemy