使用以下命令查询数据库时
@robots = Robot.all(:condition => [:a => 'b'], :limit => 50, :offset => 0)
获取没有:limit
的总行数的最佳方法是什么?
在原始MySQL中,您可以执行以下操作:
SELECT SQL_CALC_FOUND_ROWS * FROM robots WHERE a=b LIMIT 0, 50
SELECT FOUND_ROWS();
这样做是否有积极的记录方式?
答案 0 :(得分:4)
这对我有用:
ps = Post.all(:limit => 10, :select => "SQL_CALC_FOUND_ROWS *")
Post.connection.execute("select found_rows()").fetch_hash
=> {"found_rows()"=>"2447"}
这可能不适用于连接或任何复杂的操作,但它适用于简单的情况。
答案 1 :(得分:2)
Robot.count实际上是你想要的解决方案。
阅读上述评论之一,看起来您可能对.count如何工作有误解。只有在没有参数的情况下,它才会返回表中所有行的计数。
但是如果你传递的条件相同,那么你传递给all / find例如:
Robot.count(:conditions => {:a => 'b'})
.count()将返回与给定条件匹配的行数。 显而易见 - 您甚至可以将条件哈希保存为变量以传递到两者 - 以减少重复,因此:
conds = {:a => 'b'}
@robots = Robot.all(:conditions => conds, :limit => 50)
@num_robots = Robot.count(:conditions => conds)
话虽如此 - 你不能对结果集进行事后计数(就像在你的例子中一样)。即你不能只运行你的查询,然后询问它将找到多少行。你实际上必须故意打电话给.count。
答案 2 :(得分:1)
search = Robot.all(:condition => ["a=b"], :offset => 0)
@robots = search[0..49]
@count = search.count
那应该得到你想要的东西,让所有机器人进行计数,然后将@robots
设置为前50个。如果机器人表很大,可能在资源方面有点贵。
你当然可以这样做:
@count=Robot.all(:condition => ["a=b"], :offset => 0).count
@robots=Robot.all(:condition => ["a=b"], :limit => 50, :offset => 0)
但是每次请求都会对数据库进行两次打击(尽管rails确实有查询缓存)。
两种解决方案仅使用活动记录,因此与数据库无关。
您需要查询返回的总数是多少?如果它的分页看起来Will_paginate (Railscast)可以用AJAX等扩展......
答案 3 :(得分:0)
尝试find_by_sql可能有所帮助。
答案 4 :(得分:0)
@robots.size
您要找的是什么?或Robot.count
?
否则,请澄清。
答案 5 :(得分:0)
我认为 hakunin 是对的。
通过查询生成的查询数组的大小,您无法通过查询返回行返回。
@robots = Robot.find_by_sql("Your sql")
or
@robots = Robot.find(:all , :conditions=>["your condiitons"] )
@robots.size or @robots.count