我有很多下列代码段一个Rails应用程序:在Rails中进行计数的正确方法是什么?
Our active community of <%= Account.find_all_by_admin(false).count %>
我的问题是,这是要做的看法计数的正确方法?看起来这么“肮脏”,是否有更多的铁路呢,重要的方法呢?我正在考虑命名范围,但我只想确保这些类型的东西不会对性能产生更大的影响。
谢谢你,
我有很多下列代码段一个Rails应用程序:在Rails中进行计数的正确方法是什么?
Our active community of <%= Account.find_all_by_admin(false).count %>
我的问题是,这是要做的看法计数的正确方法?看起来这么“肮脏”,是否有更多的铁路呢,重要的方法呢?我正在考虑命名范围,但我只想确保这些类型的东西不会对性能产生更大的影响。
谢谢你,
我建议你避免直接访问我的模板中的数据库,因为那时你在缓存时失去了一些灵活性。
尝试准备好所有需要在动作中呈现的数据,然后使用有意义的实例变量,如@number_of_accounts
或@accounts.count
。
这会让你的看法更清洁,更容易调试,也更干燥一点,如果你渲染不同的格式(HTML,JSON等)
至于你如何让你的号码的行动 - 它不”吨真的管那么多了,刚刚摆脱find_ *方法逐渐远离作用域和写可读的代码
命名的范围应该不会对性能
scope :not_admin, where(:admin => false)
然后产生影响,你可以有Account.not_admin.count
每DGM的评论编辑:要检查在生成的SQL控制台,比较Account.not_admin.to_sql
与Account.find_all_by_admin(false).to_sql
'Account.not_admin.count.to_sql'是一个错误,至少在rails 3中,因为count返回一个Fixnum。 – DGM 2010-12-14 13:56:53
糟糕。无法在这里测试,但你必须是正确的。但是,Account.not_admin.to_sql和Account.find_all_by_admin(false).to_sql应该是等效的。 – 2010-12-14 14:46:04
在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')
也看看这篇文章:http://www.railway.at/2010/03/09/named-scopes-are-dead/ – 2010-12-14 13:57:21
+1为加拿大,呃;-) – Ted 2013-07-02 07:34:17
你不”:
要注意,如果您发出
Contact.find_all_by_country("Canada").count
count
是对数组类的方法,并在数据库中实际上并没有发出计数是非常重要的t需要一个名称范围来执行计数。
Account.where(:admin => false).count
但命名作用域是使代码更加可重用的极好方法。
命名作用域对应用程序没有任何明显的性能影响。
您可以使用下面的查询,而不是Account.where(:admin => false).count
Account.select(:id).where(:admin => false).count
只需选择而不是选择所有的一列。它生成以下查询,它比前一个更快:
SELECT COUNT("accounts"."id") FROM "accounts" where admin = false
这是这样的答案我在寻找,因为我知道如何去做,我只是想知道做到这一点的最佳方式。 – Gotjosh 2010-12-14 17:51:46