加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 使用rails中的ActiveRecord从数据库返回每第n

发布时间:2020-12-16 23:00:30 所属栏目:百科 来源:网络整理
导读:Ruby 1.9.2 / rails 3.1 / deploy到heroku – posgresql 嗨,一旦与一个对象有关的行数超过一定数量,我希望将每个第n行拉回来.这只是因为行(部分)使用行来显示图形数据,所以一旦返回的行数超过20,那么每秒返回一次就好了,依此类推. 这个问题似乎指向了正确的
Ruby 1.9.2 / rails 3.1 / deploy到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子句语法:

Row numbering in PostgreSQL

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

我是否错过了一种更明显的方式来有效地返回每个第n个任务,或者如果我在正确的轨道上有任何指针要走的路?显然,返回所有数据并在之后将其固定在轨道中是可能的,但非常低效.

谢谢!

解决方法

我想你正在寻找像这样的查询:
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子句或其他修改以满足您的需要.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读