2011-08-19 66 views
6

所以,我有一個Photo模型,可以在full_sizepresentation_size下載。當用戶下載照片時,我會在照片的full_downloadspresentation_downloads屬性上進行跟蹤。軌道:由兩列總和訂購

這樣很好。

有時我想知道總共有多少次下載。我有一個簡單的方法,total_downloads它看起來像這樣:

def total_downloads 
    self.full_downloads + self.presentation_downloads 
end 

我的問題是:我希望能夠通過這三個(全,演示,總下載量)的訂購照片。前兩個很容易,但是如何通過兩列之和來完成訂單?注意,這至少需要兼容SQLite和PG。

一個側面的問題,將total_downloads方法作爲一個查詢會更快,如果是的話,最好的寫法是什麼?我知道你可以打電話Photo.sum(...),但我不知道如何做到這一點,在單個記錄上的兩列。

謝謝!

+0

你可以直接編寫SQL,或者這會是一個問題嗎? –

+0

@Devin M - 我會做我該做的事情:) – Andrew

回答

16

你可以試試這個:

Photo.order('full_downloads + presentation_downloads') 

它將運行該SQL查詢:

SELECT "photos".* FROM "photos" ORDER BY full_downloads + presentation_downloads 

這是潛在的慢,但。如果您的數據集較大並經常使用此排序順序,則應考慮創建一個total_downloads列,並在記錄的full_downloadspresentation_downloads列更改時重新計算其值。

+4

+1潛在的緩慢,但仍然肯定比Ruby更快。 –

+0

@Kirk:是的,沒錯:) – htanata

+0

看起來不錯。謝謝! – Andrew

3

Photo.order('full_downloads + presentation_downloads DESC')

這肯定是不是做在Ruby中的排序快得多。