2010-12-14 62 views
5

我有很多下列代码段一个Rails应用程序:在Rails中进行计数的正确方法是什么?

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

我的问题是,这是要做的看法计数的正确方法?看起来这么“肮脏”,是否有更多的铁路呢,重要的方法呢?我正在考虑命名范围,但我只想确保这些类型的东西不会对性能产生更大的影响。

谢谢你,

回答

6

我建议你避免直接访问我的模板中的数据库,因为那时你在缓存时失去了一些灵活性。

尝试准备好所有需要在动作中呈现的数据,然后使用有意义的实例变量,如@number_of_accounts@accounts.count

这会让你的看法更清洁,更容易调试,也更干燥一点,如果你渲染不同的格式(HTML,JSON等)

至于你如何让你的号码的行动 - 它不”吨真的管那么多了,刚刚摆脱find_ *方法逐渐远离作用域和写可读的代码

+0

这是这样的答案我在寻找,因为我知道如何去做,我只是想知道做到这一点的最佳方式。 – Gotjosh 2010-12-14 17:51:46

2

命名的范围应该不会对性能

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

然后产生影响,你可以有Account.not_admin.count

每DGM的评论编辑:要检查在生成的SQL控制台,比较Account.not_admin.to_sqlAccount.find_all_by_admin(false).to_sql

+0

'Account.not_admin.count.to_sql'是一个错误,至少在rails 3中,因为count返回一个Fixnum。 – DGM 2010-12-14 13:56:53

+0

糟糕。无法在这里测试,但你必须是正确的。但是,Account.not_admin.to_sql和Account.find_all_by_admin(false).to_sql应该是等效的。 – 2010-12-14 14:46:04

1

在rails 3中,一个简单的调用来计算一个简单的co UNT要求:

Contact.count 

被解析为:

SELECT COUNT(*) AS count_id FROM "contacts" 

一个找到所有字段的名称会解析:

Contact.find_all_by_country("Canada") 

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

我会建议索引你的管理员列更快的查找速度,这可以被翻译成命名的范围,但它本身只会预定义查询,而不是优化它。

Contact.find_all_by_country("Canada").count 

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

也看看这篇文章:http://www.railway.at/2010/03/09/named-scopes-are-dead/ – 2010-12-14 13:57:21

+0

+1为加拿大,呃;-) – Ted 2013-07-02 07:34:17

7

你不”:

要注意,如果您发出

Contact.find_all_by_country("Canada").count 

count是对数组类的方法,并在数据库中实际上并没有发出计数是非常重要的t需要一个名称范围来执行计数。

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

但命名作用域是使代码更加可重用的极好方法。

命名作用域对应用程序没有任何明显的性能影响。

0

您可以使用下面的查询,而不是Account.where(:admin => false).count

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

只需选择而不是选择所有的一列。它生成以下查询,它比前一个更快:

SELECT COUNT("accounts"."id") FROM "accounts" where admin = false 
相关问题