2011-11-23 22 views
6

紅寶石1.9.2數據庫/軌道3.1 /部署到heroku上 - > posgresql返回每第n行從在軌使用ActiveRecord

您好,一旦數字對象有關的行越過一定量時,我而是希望拉回每第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 

而任何試圖用eg立足我OVER子句語法上的事情,我在回答上看到這樣一個問題:

Row numbering in PostgreSQL

結束在語法錯誤,我不能得到一個結果。

我是否錯過了更有效地返回每個第n個任務的更明顯的方法,或者如果我在正確的軌道上走在路上的任何指針?顯然返回所有的數據並在後來修復它是可能的,但效率非常低。

謝謝!

回答

7

我認爲你正在尋找這樣一個查詢發現:

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

2

如果我解決了這個問題,我要麼自己寫SQL,就像鏈接到的SQL一樣。你可以用

my_model.connection.execute('...') 

做到這一點,或只是獲得ID號和ID

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