2014-05-12 7 views
5

Używam szyn 3 i postrges.Jak sortować kwerendy activerecord według określonych priorytetów

Chciałbym zamówienie według określonego priorytetu.

Coś jak:

Assignment.order(priority: ['best', 'good', 'bad']) 

a ten zwróci wszystkie activerecords pierwszy z „najlepsze”, a następnie „dobre”, a następnie „złe”

mogę nie wydaje się znaleźć coś takiego. Nie potrzebuję tablicy, musi to być activerecords.

Odpowiedz

14

Zamówienie może być dowolnym kodem SQL. Możesz użyć instrukcji CASE, aby odwzorować wartości na wartości sortowane w sposób naturalny we właściwej kolejności.

Assignment.order(" 
    CASE 
     WHEN priority = 'best' THEN '1' 
     WHEN priority = 'good' THEN '2' 
     WHEN priority = 'bad' THEN '3' 
    END") 

Jeszcze lepiej, można przenieść tę logikę do modelu, dzięki czemu łatwiej jest zadzwonić z kontrolerami:

class Assignment < ActiveRecord::Base 
    ... 
    def self.priority_order 
    order(" 
     CASE 
      WHEN priority = 'best' THEN '1' 
      WHEN priority = 'good' THEN '2' 
      WHEN priority = 'bad' THEN '3' 
     END") 
    end 
end 

Następnie można po prostu zadzwonić Assignment.priority_order aby uzyskać posortowane rekordy.

Jeśli ta kolumna jest sortable w widoku, należy dodać parametr do metody na kierunku:

def self.priority_order(direction = "ASC") 
    # Prevent injection by making sure the direction is either ASC or DESC 
    direction = "ASC" unless direction.upcase.match(/\ADESC\Z/) 
    order(" 
     CASE 
     WHEN priority = 'best' THEN '1' 
     WHEN priority = 'good' THEN '2' 
     WHEN priority = 'bad' THEN '3' 
     END #{direction}") 
end 

Następnie można nazwać Assignment.priority_order(params[:direction]) przejść w sortowaniu od kontrolera.

+0

dzięki temu działa – sonnyhe2002