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)