2010-12-14 23 views
5

Ich habe eine Rails-Anwendung mit vielen folgenden Teilen des Codes:Was ist der richtige Weg, um in Rails zu zählen?

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

Meine Frage ist dies der richtige Weg zählt auf Ansichten zu tun? Es scheint so "dreckig" ist es eine mehr railish, Art und Weise zu tun zählt? Ich denke vielleicht an Namensbereiche, aber ich möchte nur sicher sein, dass diese Art von Dingen keinen größeren Einfluss auf die Leistung haben wird.

danken Ihnen,

Antwort

6

Ich würde Ihnen empfehlen, den direkten Zugriff auf die Datenbank in meinen Vorlagen zu vermeiden, da Sie dann ein wenig Flexibilität beim Caching verlieren.

Versuchen Sie stattdessen, alle Daten vorzubereiten, die Sie in Ihrer Aktion rendern müssen, und verwenden Sie sinnvolle Instanzvariablen wie @number_of_accounts oder @accounts.count.

Dies wird Ihre Ansichten sauberer und einfacher zu debuggen machen und auch ein bisschen mehr DRY wenn Sie Maßnahmen in verschiedenen Formaten (HTML, JSON, etc.) machen

In Bezug auf wie Sie Ihre Zahlen bekommen - es doesn‘ t wirklich wichtig, dass viel, bewegen Sie einfach weg von find_ * Methoden in Richtung Scoping und schreiben lesbaren Code

+0

Dies war die Art von Antwort Ich habe gesucht, weil ich weiß, wie es geht, ich wollte nur den besten Weg wissen, es zu tun. – Gotjosh

2

Eine benannte Geltungsbereich sollte keine Auswirkungen auf die Leistung haben

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

Dann können Sie Account.not_admin.count

Herausgegeben pro DGM Kommentar haben: die erzeugte SQL in a Um zu überprüfen, Konsole, vergleichen Account.not_admin.to_sql mit Account.find_all_by_admin(false).to_sql

+0

'Account.not_admin.count.to_sql' ein Fehler ist, zumindest in den Schienen 3, da Zählung einen Fixnum zurückgibt. – DGM

+0

Hoppla. Konnte hier nicht testen, aber Sie müssen richtig sein. Account.not_admin.to_sql und Account.find_all_by_admin (false) .to_sql sollten jedoch gleichwertig sein. –

1

In Schienen 3 ein einfacher Aufruf zu zählen Probleme eine einfache co unt Anfrage:

Contact.count 

wird aufgelöst wie:

SELECT COUNT(*) AS count_id FROM "contacts" 

ein alle Feldnamen wie lösen finden:

Contact.find_all_by_country("Canada") 

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

würde ich für eine schnellere Lookups und diese Indizierung Ihrer Admin-Spalte empfehlen kann in einen benannten Bereich übersetzt werden, aber das allein wird die Abfrage nur vordefinieren, nicht optimieren.

Es ist wichtig zu beachten, dass, wenn Sie

Contact.find_all_by_country("Canada").count 

count ist ein Verfahren auf der Array-Klasse ausgeben und nicht ausgestellt tatsächlich eine Zählung auf der Datenbank:

Contact.find_all_by_country("Canada").count 

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

werfen Sie auch einen Blick auf diesen Artikel: http://www.railway.at/2010/03/09/named-scopes-are-dead/ –

+0

+1 für Kanada, eh ;-) – Ted

7

Sie don‘ t benötigen einen Namensbereich, um eine Zählung durchzuführen.

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

Aber benannte Bereiche sind eine hervorragende Möglichkeit, Ihren Code wiederverwendbar zu machen.

Benannte Bereiche haben keine merklichen Auswirkungen auf die Leistung Ihrer Anwendung.

0

können Sie folgende Abfrage verwenden, anstatt Account.where(:admin => false).count

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

nur eine Spalte auswählen, anstatt alle auszuwählen. Es erzeugt die folgende Abfrage, und es ist schneller als die vorherige:

SELECT COUNT("accounts"."id") FROM "accounts" where admin = false 
Verwandte Themen