Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Rails中进行计数的正确方法是什么?_Sql_Ruby On Rails_Ruby_Count - Fatal编程技术网

Sql 在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

我有一个rails应用程序,其中包含许多以下代码:

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 %>