Sql 在Rails中进行计数的正确方法是什么?
我有一个rails应用程序,其中包含许多以下代码:Sql 在Rails中进行计数的正确方法是什么?,sql,ruby-on-rails,ruby,count,Sql,Ruby On Rails,Ruby,Count,我有一个rails应用程序,其中包含许多以下代码: Our active community of <%= Account.find_all_by_admin(false).count %> 我的问题是,这是基于观点的正确方法吗?看起来这么脏有没有更讽刺的方法来计数?我可能在考虑命名作用域,但我只想确保这些类型的东西不会对性能产生更大的影响 谢谢,命名范围不应该对性能产生影响 scope :not_admin, where(:admin => false) 然后你可以拥有A
Our active community of <%= Account.find_all_by_admin(false).count %>
我的问题是,这是基于观点的正确方法吗?看起来这么脏有没有更讽刺的方法来计数?我可能在考虑命名作用域,但我只想确保这些类型的东西不会对性能产生更大的影响
谢谢,命名范围不应该对性能产生影响
scope :not_admin, where(:admin => false)
然后你可以拥有Account.not_admin.count
根据DGM的注释编辑:要检查控制台中生成的SQL,请将Account.not_admin.To_SQL与Account.find_all_by_adminfalse进行比较。要在rails 3中检查SQL,对count的简单调用会发出一个简单的计数请求:
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
count是array类上的一个方法,实际上不会对数据库发出计数:
Contact.find_all_by_country("Canada").count
SELECT "contacts".* FROM "contacts" WHERE ("contacts"."country" = 'Canada')
执行计数不需要名称范围
Account.where(:admin => false).count
但是命名作用域是使代码更具可重用性的一种很好的方法
命名作用域对应用程序的性能没有任何明显的影响。我建议您避免直接访问我的模板中的数据库,因为这样在缓存方面就会失去一些灵活性 尝试准备所有需要在操作中呈现的数据,然后使用有意义的实例变量,如@number\u of\u accounts或@accounts.count 这将使您的视图更干净、更易于调试,如果您以不同的格式html、json等呈现操作,也会使视图更干爽
至于如何获取数字,其实没什么大不了的,只需从查找方法转向范围和编写可读代码即可您可以使用以下查询而不是帐户。其中:admin=>false.count 只选择一列,而不是全部选择。它生成以下查询,并且比上一个查询更快:
SELECT COUNT("accounts"."id") FROM "accounts" where admin = false
您应该在控制器中创建一个实例变量,并在视图中使用它。
这将使你的观点清晰
@accounts_count = Account.where(admin: false).count
在视图中使用它,就像`
如果要循环显示结果和计数,可以使用以下方法:
@accounts = Account.where(admin: false)
鉴于此,请写如下:
<%= @accounts.count %>
// For looping account
<% @accounts.each do |account| %>
# do some stuff
<% end %>
如果您想要相同的顺序,那么首先加载用户对象,如下所示
<%= @accounts.load.size %>
// For looping account
<% @accounts.each do |account| %>
# do some stuff
<% end %>
Account.not_admin.count.to_sql是一个错误,至少在rails 3中是这样,因为count返回一个Fixnum.Oops。无法在此测试,但您必须是正确的。但是,Account.not_admin.to_sql和Account.find_all_by_adminfalse.to_sql应该是等效的。请看这篇文章:这是我一直在寻找的答案,因为我知道怎么做,我只是想知道最好的方法。
// For looping account
<% @accounts.each do |account| %>
# do some stuff
<% end %>
<%= @accounts.size %>
<%= @accounts.load.size %>
// For looping account
<% @accounts.each do |account| %>
# do some stuff
<% end %>