2011-11-22 29 views
1

我正在开发一个Rails应用程序。SQL执行后得到分片结果

我执行后SQL命令类似以下内容:

sql="select * from some_tbl;" 
rslt = ActiveRecord::Base.connection.execute(sql) 

rslt我怎样才能得到切片的结果吗?我的意思是,例如,如果rslt.size是200,我想从第5个开始得到20个结果(这与阵列操作arr[5,20]一样),该怎么做呢?

回答

2

尝试rslt转换为数组:

... 
rslt.to_a[5,20] 
0

您不需要在rails中使用sql来使用ActiveRecord来创建,读取,更新和删除数据库中的条目。你应该阅读从http://guides.rubyonrails.org/的初学者指南,特别是Model部分将因为它处理数据库而受到干扰!

+1

嗨,我知道这一点。我有一个特殊的情况来使用它。谢谢你,但你的回答并没有涉及我所问的 – Mellon

+0

对不起,但你的问题表明你正在尝试做一些简单的SQL与原生的SQL而不是有效的记录。 – davidb

0

对象从ActiveRecord::Base.connection.execute返回实际上是一个Array这意味着你可以使用rslt[5,20]获得20个结果开始在第6元。

我还想指出,您可以使用find_in_batches这是一个由ActiveRecord提供的API。

的API页面上给出的例子是:

Person.where("age > 21").find_in_batches do |group| 
    sleep(50) # Make sure it doesn't get too crowded in there! 
    group.each { |person| person.party_all_night! } 
end 

编辑:对不起它不为你工作。从我的轨道直接(3.0.10)控制台

ruby-1.8.7-p299 :006 > sql = "select * from domains" 
=> "select * from domains" 
ruby-1.8.7-p299 :007 > ActiveRecord::Base.connection.execute(sql).class 
=> Array 
ruby-1.8.7-p299 :008 > ActiveRecord::Base.connection.execute(sql).length 
=> 18 
ruby-1.8.7-p299 :010 > ActiveRecord::Base.connection.execute(sql)[5,20].length 
=> 13 
+0

嗨,我正在使用Rail v2.3。我试过rslt [5,20]这是失败的,这就是为什么我发布这个问题。我不知道你为什么说rslt [5,20]正在工作......我得到的错误是类似于“活动记录结果得到,但[]期望数组”,显然这是行不通的。 – Mellon

+0

@Mellon我报告说,它工作,因为它确实为我工作。使用红宝石1.8.7p299和轨道3.0.10,我能够得到我上面报告的结果。祝你好运。 – sorens