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

标签 ruby-on-rails postgresql activerecord

Ruby 1.9.2/rails 3.1/部署到 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 个任务,或者如果我走在正确的 rails 上,是否有任何指示?显然返回所有数据并在之后将其修复在 Rails 中是可能的,但效率非常低。

谢谢!

最佳答案

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

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

关于ruby-on-rails - 在 rails 中使用 ActiveRecord 从数据库返回每第 n 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8250738/

相关文章:

ruby-on-rails - Ruby文档更新错误

ruby-on-rails - 如何运行特定版本的 rake

postgresql - 用户不是 super 管理员和大对象的 pg_dump

postgresql - 尝试访问数据库或从数据库获取数据时,用户的 PostgresQL 密码身份验证失败的问题?

node.js - 在 Node/ExpressJs 中类似的 Rails ActiveRecord 迁移

ruby-on-rails - 在 form_for 或 fields_for 中获取对象的 id

ruby-on-rails - haml 添加样式到表单元素

arrays - 将 PostgreSQL bigint 数组唯一值移动到另一个索引

ruby-on-rails - 不使用任何方法或使用 `all()` 生成 ActiveRecord::Relation

ruby-on-rails - 通过 Rails ActiveRecord Association 调用类方法