Sql Rails 3将限制和偏移应用于子查询

Sql Rails 3将限制和偏移应用于子查询,sql,ruby-on-rails-3,postgresql,activerecord,subquery,Sql,Ruby On Rails 3,Postgresql,Activerecord,Subquery,我有一个类似这样的查询(在song.rb中): 稍后在我的应用程序中,它会通过限制和偏移,比如在控制器中: @songs = Song.new_songs.limit(10).offset(10) 就我的应用程序的结构而言,我希望保留这种设置方法,但不幸的是,它非常慢,因为它限制了外部查询而不是子查询 是否有一种方法可以公开子查询,使其接收限制和偏移量,而不是外部查询 编辑:我应该补充一点,我正在使用postgres 9.2 编辑2:我想以这种方式执行此操作的原因是我正在进行分页,我需要获得总

我有一个类似这样的查询(在song.rb中):

稍后在我的应用程序中,它会通过限制和偏移,比如在控制器中:

@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)

如果我要以某种方式改变它,我必须完全重做它(在很多地方)。通过在实际调用之前不限制它,我可以在中间进行计数,然后只得到最后的页面。我想我正在寻找更多关于如何利用内部查询来完成这方面的建议,而不会随着数据库的增长而变得非常缓慢。

< P>您应该考虑使用GEM。这让你远离了用手计算所有这些的迷雾;-)

我无法尝试该解决方案,我也不是ruby专家,但据我所知,您需要一个对象,该对象将所有方法调用传递给完整查询,但限制和偏移量除外,同时存储有限的子查询

它可能看起来像这样:

@songs = Song.new_songs
...
@pages = @songs.count / 10
...
render @songs.limit(params[:page]).offset(0)
class LimitedSubquery
而不是像这样称呼它

def新歌
LimitedSubquery.new(Song.grouped\u order\u published)
结束
如果我做错了什么,请编辑我

问候


TC

所以我通过不做子查询来解决这个问题。不过,这仍然是一个需要解决的有趣问题。因此,问题是您需要知道匹配的总数,并获得10个片段,但您不想运行查询两次,对吗?当然,你不想改变太多的代码,我不理解你的评论。据我所知,您正在寻找分页。如果没有,请澄清你的问题。非常感谢。另一种方法是给new_songs方法两个参数limit和offset,然后将它们用于def self.new_songs(limit,offset)Song.where(id:Song.grouped_order_published.limit(limit).offset(offset))。选择重要的东西end Calling@songs=Song.new_songs.limit(10).offset(10)根本不起作用。我想这已经足够清楚了。如果你想看看什么样的答案能够真正解决我的问题,请查看所选答案。很高兴你现在有了问题的解决方案!没有检查,但逻辑是合理的。我最终找到了一种避免子查询的方法,但是你应该得到分数。谢谢!原始查询似乎可以重写,但正如您在评论中所述,您希望找到原始问题的解决方案。