如何用Ransack排序枚举?

时间:2017-08-28 14:52:28

标签: ruby-on-rails ransack

我有一个表users,其枚举角色设置如下:

enum role: {
    superadmin: 0,
    admin: 1,
    user: 2
}

我想用Ransack和其他属性一样对它进行排序。我怎么能这样做?

当然,我可以按字母顺序对它们进行排序,但如果我想在将来添加其他角色怎么办?

1 个答案:

答案 0 :(得分:0)

我根据https://stackoverflow.com/a/37599787/2055858

的答案制作了一个函数
def alphabetical_enum_sql(enum, field_name)
    ordered_enum = enum.keys.sort
    order_by = ["case"]
    ordered_enum.each_with_index do |key, idx|
        order_by << "WHEN #{field_name}=#{enum[key]} THEN #{idx}"
    end
    order_by << "end"
    order_by.join(" ")
end

然后像

一样使用它
scope :order_by_role, -> {
   order(alphabetical_enum_sql(YourModel.roles, "role"))
}