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.
dzięki temu działa – sonnyhe2002