Rails - 对列的值进行排序(优先级列)

SRa*_*ack 6 sql postgresql ruby-on-rails

我有一个priority = ['HIGH', 'MEDIUM', 'LOW']用于设置'紧急'数据库列的数组.我想检索按优先级排序的数据,尽管应用Task.order(:urgency)按字母顺序返回结果(即HIGH,LOW,MEDIUM).

我正在使用PostgreSQL作为数据库.

我(显然)喜欢这些从高优先级返回到低优先级.有没有一种简单的方法来实现它,也许使用值在数组中的位置?

MrY*_*iji 12

一个简单的CASE WHEN可以做的技巧(这里使用的postgreSQL语法):

scope :urgency_ordered {
  order(<<-SQL)
    CASE tasks.urgency 
    WHEN 'HIGH' THEN 'a' 
    WHEN 'MEDIUM' THEN 'b' 
    WHEN 'LOW' THEN 'c' 
    ELSE 'z' 
    END ASC, 
    id ASC
  SQL
}
Run Code Online (Sandbox Code Playgroud)

这样称呼它:

Task.urgency_ordered
Run Code Online (Sandbox Code Playgroud)

SQL的输出很好CASE WHEN:

scope :urgency_ordered {
  order(<<-SQL)
    CASE tasks.urgency 
    WHEN 'HIGH' THEN 'a' 
    WHEN 'MEDIUM' THEN 'b' 
    WHEN 'LOW' THEN 'c' 
    ELSE 'z' 
    END ASC, 
    id ASC
  SQL
}
Run Code Online (Sandbox Code Playgroud)