【发布时间】:2012-10-30 06:07:08
【问题描述】:
我有一个类似这样的查询(在 song.rb 中):
def self.new_songs
Song.where(id: Song.grouped_order_published).select_important_stuff
end
稍后在我的应用程序中,它会通过限制和偏移量,让我们在控制器中说:
@songs = Song.new_songs.limit(10).offset(10)
我的应用程序的结构方式,我想保留这种设置方法,但不幸的是它真的很慢,因为它限制了外部查询而不是子查询。
有没有办法可以公开子查询,使其接收限制和偏移量而不是外部查询?
编辑:我应该添加我正在使用 postgres 9.2。
编辑 2:我想以这种方式执行此操作的原因是我正在进行分页,我需要获取总行数的“计数”。所以我做了这样的事情:
@songs = Song.new_songs
...
@pages = @songs.count / 10
...
render @songs.limit(params[:page]).offset(0)
如果我要以某种方式更改它,我将不得不完全重做(在很多地方)。通过在实际调用它之前不限制它,我可以在两者之间进行计数,然后在最后只获取页面。我想我正在寻找更多关于如何使用内部查询完成此操作的建议,而不会随着数据库的增长而变得非常缓慢。
【问题讨论】:
-
所以我通过不做子查询来解决这个问题。不过,这仍然是一个有趣的问题。
-
所以问题是您需要知道匹配的总数并获得 10 个切片,但您不想运行两次查询,对吧?当然,您不希望更改的代码超出您的需要。
标签: sql ruby-on-rails-3 postgresql activerecord subquery