2011-09-21 29 views
3

我想在我的某列上使用rank()函數PostgreSQL。帶有Rails的Postgres窗口函數列

Character.select("*, rank() OVER (ORDER BY points DESC)") 

但因爲我沒有在我的臺導軌秩列與查詢不包括它。什麼是正確的方式來獲得我的ActiveRecord對象中的排名?

+0

我不能相信我沒想到只列添加到數據庫中。似乎按預期工作,只要rank()在SELECT語句中是最後一個。 – bbck

回答

3

試試這個:

Character.find_by_sql("SELECT *, rank() OVER (ORDER BY points DESC) FROM characters") 

它應該返回一個等級的屬性,你的角色對象,如記錄here。但是,這可能不是數據庫不可知的,並且如果您繞過對象,則會變得雜亂無章。

另一個(昂貴的)解決方案是向表中添加一個rank列,並且在記錄被保存或銷燬時使用.order函數重新計算所有記錄的等級。

編輯:

另一個想法適用於單記錄查詢可以看到奔here

+0

即使find_by_sql在ActiveRecord中也不返回一個排列列。我看到你提到的另一個問題,但我認爲它不適合我的情況。我正在分頁結果,並會爲每條記錄運行查詢。 rank()函數是我發現的最好的方法,我無法使它工作。 – bbck

+0

你確定嗎?我剛剛在Postgre + Postgis和MRI Ruby 1.9.2-p180上的Rails 3.0.9應用程序上嘗試過,並且它可以工作(在控制檯中)。如果你在控制檯中試過,inspect方法不會返回屬性,所以你不會看到它,但它在那裏(你可以通過調用對象上的.attributes或直接調用rank來查看它)。 –

+0

啊,你是對的。當我沒有看到它時,我剛剛解僱了它。 – bbck