如何从rails中的活动记录对象获取FOUND_ROW()?

时间:2010-06-18 00:54:22

标签: mysql ruby-on-rails

使用以下命令查询数据库时

@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();

这样做是否有积极的记录方式?

6 个答案:

答案 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