Вы можете использовать оператор case в предложении where. Это немного некрасиво, но должно работать:
class Task
PRIORITIES_ORDERED = ['high', 'medium', 'low']
# Returns a case statement for ordering by a particular set of strings
# Note that the SQL is built by hand and therefore injection is possible,
# however since we're declaring the priorities in a constant above it's
# safe.
def self.order_by_case
ret = "CASE"
PRIORITIES_ORDERED.each_with_index do |p, i|
ret << " WHEN priority = '#{p}' THEN #{i}"
end
ret << " END"
end
named_scope :by_priority, :order => order_by_case
end
А затем, когда вы хотите, чтобы они упорядочены по приоритету, вы можете сделать что-то вроде этого:
Task.all.by_priority
Конечно, как уже упоминали другие люди, лучше сделать внешний ключ для таблицы приоритетов вместо столбца текстовой строки. В таблице Priorty вы можете добавить столбец позиции в виде целого числа, по которому можно отсортировать данные, и для облегчения этого существуют плагины.