Ruby on rails 使用rails中的ActiveRecord从数据库中每隔n行返回一次

Ruby on rails 使用rails中的ActiveRecord从数据库中每隔n行返回一次,ruby-on-rails,postgresql,activerecord,Ruby On Rails,Postgresql,Activerecord,Ruby 1.9.2/rails 3.1/部署到heroku-->posgresql上 嗨,一旦与一个对象相关的行数超过了一定的数量,我希望每N行向后拉一次。这仅仅是因为行(部分)用于显示用于绘图的数据,所以一旦返回的行数超过20,最好每秒返回一行,以此类推 这个问题似乎指向了正确的方向: 对行号进行mod是有意义的,但基本上使用: @widgetstats = self.widgetstats.find(:all,:conditions => 'MOD(ROW_NUMBER(),3)

Ruby 1.9.2/rails 3.1/部署到heroku-->posgresql上

嗨,一旦与一个对象相关的行数超过了一定的数量,我希望每N行向后拉一次。这仅仅是因为行(部分)用于显示用于绘图的数据,所以一旦返回的行数超过20,最好每秒返回一行,以此类推

这个问题似乎指向了正确的方向:

对行号进行mod是有意义的,但基本上使用:

@widgetstats = self.widgetstats.find(:all,:conditions => 'MOD(ROW_NUMBER(),3) = 0 ')
不起作用,它返回一个错误:

PGError: ERROR:  window function call requires an OVER clause
任何试图解决这个问题的尝试,例如,根据我在这个问题的答案中看到的东西,我的OVER子句语法:

以语法错误结束,我无法得到结果

我是否错过了一种更明显的有效返回第n个任务的方法,或者如果我在正确的轨道上,是否在前进的路上有任何指针?显然,返回所有数据并随后在rails中修复是可能的,但效率极低


谢谢大家!

如果我要解决这个问题,我要么自己编写SQL,就像您链接的SQL一样。你可以用它来做这个

my_model.connection.execute('...')
或者只需获取id号并按id查找即可

ids = (1..30).step(2)
my_model.where(id => ids)

我认为您正在寻找这样一个查询:

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子句或其他修改以满足您的需要