2010-12-14 37 views
5

Pek çok kod parçasına sahip bir ray uygulamasına sahibim:Rails'de saymanın doğru yolu nedir?

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

Sorum şu: Bu, görüşlere sayılmanın doğru yolu mu? Öyle görünüyor ki, "kirli" saymak daha saygılı bir yol var mı? Belki de kapsamları düşünürüm, ama bu tür şeylerin performansta daha fazla etkiye sahip olmayacağından emin olmak istiyorum.

Teşekkürler,

cevap

6

Ben önbelleğe geldiğinde o zaman esneklik biraz kaybediyoruz çünkü benim şablonlarda veritabanına doğrudan erişim önlemek için tavsiye ederim.

Yapmanız gereken tüm verileri işleminize hazırlamaya çalışın ve sonra @number_of_accounts veya @accounts.count gibi anlamlı örnek değişkenleri kullanın.

Bu hata ayıklama daha temiz ve daha kolay görüşlerini yapacak ve ayrıca farklı biçimlerde (html, json, vs) Eğer numaralarını nasıl elde edersiniz gelince

harekete biraz daha KURU hale eğer - bu kokan t gerçekten bu kadar önemli, sadece sen Onun yerine bütün seçmek yerine, bir sütun seçmelisiniz yerine Account.where(:admin => false).count

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

aşağıdaki sorguyu kullanabilirsiniz okunabilir kod

+0

Bu tür bir cevaptı Bakıyordum, bunu nasıl yapacağımı biliyorum, sadece bunu yapmanın EN İYİ yolunu bilmek istedim. – Gotjosh

2

bir adlandırılmış kapsam Eğer

Account.not_admin.count DGM yorumuna başına Düzenlendi olabilir performans Sonra

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

üzerinde bir etkisi olmamalıdır, Teşekkür: Bir oluşturulan SQL denetlemek için konsol, yaşanan sorunlar basit bir işbirliği saymak Account.find_all_by_admin(false).to_sql raylar 3'te

+0

'Account.not_admin.count.to_sql' en az raylar 3'te bir hata olduğunu sayımı Fixnum döndürür beri. – DGM

+0

Oops. Burada test edilemedi, ama doğru olmalısın. Ancak, Account.not_admin.to_sql ve Account.find_all_by_admin (false) .to_sql eşdeğer olmalıdır. –

1

basit çağrısı ile Account.not_admin.to_sql karşılaştırmak unt istek: Bir şekilde çözecektir alan adı bütün bulmak

SELECT COUNT(*) AS count_id FROM "contacts" 

:

Contact.count 

olarak çözülene

Contact.find_all_by_country("Canada") 

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

daha hızlı aramalar ve bunun için yönetici sütununu indeksleme öneriyoruz adlandırılmış bir kapsam içine tercüme edilebilir, ancak kendi başına sadece sorguyu önceden tanımlayacaktır, optimize etmeyecektir.

Contact.find_all_by_country("Canada").count 

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

da bu makaleye bir göz atın: Kanada için http://www.railway.at/2010/03/09/named-scopes-are-dead/ –

+0

+1, eh ;-) – Ted

7

Sen don':

Size

Contact.find_all_by_country("Canada").count 

count dizi sınıfına bir yöntemdir ve aslında veritabanı üzerinde bir sayı vermemektedir sorunu eğer dikkat etmek önemlidir Bir sayımı gerçekleştirmek için bir isim kapsamına ihtiyaç duyar.

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

Ancak adlandırılmış kapsamlar, kodunuzu yeniden kullanılabilir hale getirmek için mükemmel bir yoldur.

Named kapsamları uygulamanıza üzerinde herhangi bir belirgin performans etkisi yoktur.

0

kapsam doğru uzağa find_ * yöntemlerle hareket ve yazma. Aşağıdaki sorgu oluşturur ve onu öncekinden daha hızlıdır:

SELECT COUNT("accounts"."id") FROM "accounts" where admin = false 
İlgili konular