Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.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
Mysql 如何从rails中的活动记录对象中找到_ROW()?_Mysql_Ruby On Rails - Fatal编程技术网

Mysql 如何从rails中的活动记录对象中找到_ROW()?

Mysql 如何从rails中的活动记录对象中找到_ROW()?,mysql,ruby-on-rails,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(); 有没有一种有效的记录方法可以做到这

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

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

有没有一种有效的记录方法可以做到这一点?

试试看,也许会有帮助。

@robots.size
你在找什么?或
机器人.计数

否则,请澄清。

这适用于我:

ps = Post.all(:limit => 10, :select => "SQL_CALC_FOUND_ROWS *")
Post.connection.execute("select found_rows()").fetch_hash
=> {"found_rows()"=>"2447"}

这可能不适用于连接或任何复杂的情况,但适用于简单的情况。

我认为hakunin是正确的

您只需检查查询结果数组的大小,就可以通过查询获得不返回行的结果

@robots = Robot.find_by_sql("Your sql")
or 
@robots = Robot.find(:all , :conditions=>["your condiitons"] )

@robots.size or @robots.count
这应该得到你想要的,得到所有的机器人进行计数,然后将
@Robots
设置为前50个。如果机器人的桌子很大,在资源方面可能会有点贵

你当然可以:

@count=Robot.all(:condition => ["a=b"], :offset => 0).count
@robots=Robot.all(:condition => ["a=b"], :limit => 50, :offset => 0)
但这会在每个请求中对数据库进行两次攻击(尽管rails确实有查询缓存)

这两种解决方案都只使用活动记录,因此与数据库无关


您需要查询返回的总数是多少?如果它的分页可以通过AJAX等扩展,那么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)

也就是说,您不能对结果集进行事后统计(如您的示例中所示)。也就是说,你不能只运行你的查询,然后问它会找到多少行。实际上,你必须打电话。仔细考虑。

你的例子缺少一个“限制”,这是我问题的关键。When:limit=>25,@robots.count=25,但是没有:limit的总记录就是我想要的@robots.count不是活动记录的成员(您可能会想到robots.count)Ruby 1.8.7及更高版本在模型对象上实现了count方法。现在,您可以调用@robots.count,在脚本/控制台上使用Ruby 1.8.7和Rails 2.3.8进行了尝试,没有@robots.count.Will_paginate可以获取您的总记录。搜索will_paginate代码后,他们似乎使用了“SELECT COUNT(*)…”来获取@total_Entries。您的答案包含正确的答案和一些好的想法。我接受了塔林·伊斯特的回答,因为它直接回答了我的问题。这确实会返回正确的答案。。。但它将比Robot.count慢得多,因为它会处理两次完整的查询。。。我知道您有一个非常大的表-这将花费很长时间(对于IO或返回的结果集),并且会耗尽您的内存。Robot.count(OTOH)将只返回单个“count”-这是一个更小、更快的结果。最后是一个不错的答案!count(:conditions=>{})实际上正在运行查询“SELECT count(*)as count\u all FROM robots WHERE a=b”
conds = {:a => 'b'}
@robots = Robot.all(:conditions => conds, :limit => 50)
@num_robots = Robot.count(:conditions => conds)