Релси: Подредете по сбор от две колони

И така, имам модел Photo, който може да бъде изтеглен от full_size и presentation_size. Когато потребител изтегли снимка, проследявам това в атрибута full_downloads и presentation_downloads на снимката.

Всичко това е добре.

Понякога искам да знам колко общо изтегляния има. Имам прост метод, total_downloads, който изглежда така:

def total_downloads
  self.full_downloads + self.presentation_downloads
end

Въпросът ми е: Бих искал да мога да поръчам снимки и по трите (пълни, презентационни, общо изтегляния). Първите две са лесни, но как да направите поръчка по сумата от две колони? Обърнете внимание, че това трябва да е минимум както SQLite, така и PG съвместимо.

Страничен въпрос, би ли било по-бързо да направите total_downloads метода заявка и ако да, какъв е най-добрият начин да го напишете? Знам, че за сумиране на класа можете да извикате Photo.sum(...), но не съм сигурен как да направя това за две колони в един запис.

Благодаря!


person Andrew    schedule 19.08.2011    source източник
comment
Бихте ли се съгласили да напишете SQL директно или това би било проблем?   -  person Devin M    schedule 19.08.2011
comment
@Devin M - Ще направя каквото трябва :)   -  person Andrew    schedule 19.08.2011


Отговори (2)


Можете да опитате това:

Photo.order('full_downloads + presentation_downloads')

Ще изпълни тази SQL заявка:

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

Това обаче е потенциално бавно. Ако имате голям набор от данни и често използвате този ред на сортиране, трябва да помислите за създаване на колона total_downloads и преизчисляване на нейната стойност, ако колоната full_downloads или presentation_downloads на записа се промени.

person htanata    schedule 19.08.2011

Photo.order('full_downloads + presentation_downloads DESC')

Това определено би било много по-бързо от сортирането в Ruby.

person Michael Fairley    schedule 19.08.2011