Ruby 1.9.2 / rails 3.1 / deploy to heroku - > posgresql
嗨,一旦与某个对象相关的行数超过一定数量,我希望将每个第n行拉回来。这只是因为行(部分)使用行来显示图形数据,所以一旦返回的行数超过20,那么每秒返回一次就好了,等等。
这个问题似乎指向了正确的方向: ActiveRecord Find - Skipping Records or Getting Every Nth Record
对行号进行修改是有意义的,但基本上使用:
@widgetstats = self.widgetstats.find(:all,:conditions => 'MOD(ROW_NUMBER(),3) = 0 ')
不起作用,它会返回错误:
PGError: ERROR: window function call requires an OVER clause
任何尝试用例如基于我在这个问题的答案中看到的OVER子句语法:
以语法错误结束,我无法得到结果。
我是否错过了一种更明显的方法来有效地返回每个第n个任务,或者如果我在正确的轨道上有任何指针要走的路?显然,返回所有数据并在之后将其固定在rails中是可能的,但非常低效。
谢谢!
答案 0 :(得分:7)
我认为您正在寻找像这样的查询:
SELECT * FROM (SELECT widgetstats.*, row_number() OVER () AS rownum FROM widgetstats ORDER BY id) stats WHERE mod(rownum,3) = 0
使用ActiveRecord很难构建,因此您可能会被迫执行以下操作:
@widgetstats = self.widgetstats.find_by_sql(
%{
SELECT * FROM
(
SELECT widgetstats.*, row_number() OVER () AS rownum FROM widgetstats ORDER BY id
) AS stats
WHERE mod(rownum,3) = 0
}
)
您显然希望更改使用的顺序并添加任何WHERE子句或其他修改以满足您的需求。
答案 1 :(得分:2)
如果我要解决这个问题,我要么自己编写SQL,就像你链接到的SQL一样。您可以使用
执行此操作my_model.connection.execute('...')
或只是获取ID号并按ID
查找ids = (1..30).step(2)
my_model.where(id => ids)