2011-08-19 61 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中的排序快得多。