2014-05-12 4 views
5

Ich verwende Schienen 3 und Postrges.So sortieren Sie ActiveRecord Abfrage nach spezifischen Prioritäten

Ich möchte nach einer bestimmten Priorität bestellen.

Etwas wie:

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

und dies wird alle activerecords zurückkehren zuerst mit ‚besten‘, dann ‚gut‘, dann ‚schlechte‘

Ich kann nicht scheinen, etwas Vergleichbares zu finden. Ich brauche kein Array, es müssen Activrecords sein.

Antwort

14

Reihenfolge kann jeder SQL-Code sein. Sie können eine CASE-Anweisung verwenden, um Ihre Werte Werten zuzuordnen, die natürlich in der richtigen Reihenfolge sortiert sind.

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

Noch besser ist, können Sie diese Logik auf das Modell bewegen, so dass es einfacher ist, von Controllern zu nennen:

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 

Dann können Sie einfach Assignment.priority_order rufen Sie Ihre sortierten Datensätze zu erhalten.

Wenn diese Spalte in der Ansicht sortierbar ist, einen Parameter der Methode zur Richtung hinzufügen:

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 

Dann Sie Assignment.priority_order(params[:direction]) von der Steuerung in der Sortieranlage passieren nennen würden.

+0

danke das funktioniert – sonnyhe2002

Verwandte Themen