I have a situation which I need use a specific order for queries which the attributes are an enum, something like this:
.order(“x.status = 5, x.status = 1, x.status = 6 …”), but it isn’t the best way for readability, and I haven’t found anything about how to do it on rails way.
Is a big deal create this functionality on rails? Something like:
.order(status: [:removed, :new, :active, :corrupted …])
If yes, it’s something trivial, if a haven’t contributed with rails, can I help to build that?
Are you using MySQL? It has a field function that solves this
https://www.w3schools.com/sql/func_mysql_field.asp
You could probably do the same thing with substring index with other DBMSs.
I just meet the same problem like you
ORDER_PRIORITIES = [:removed, :new, :active, :corrupted]
def self.priorities_based_order
conditions = ORDER_PRIORITIES.each_with_index.map { |value, index| “WHEN #{value} THEN #{index} ELSE 999” }.join(“\n”) # I want other statuses to be sorted lastly, you can also use FIELD function in MySQL
order_by(“CASE #{table_name}.status #{conditions} END”)
end
usage:
user.orders.priorities_based_order
``
The above codes not run yet but I think it must work.
在 2017年10月20日星期五 UTC+8上午1:30:35,Pablo Margreff写道:
Nop, I’m using postgres, but I already solved the problem, my point here is implement something on the rails way …
Hey, thanks for the answer. My final solution looks something like that, but How I said to Kevin, my point here is implement it on rails to allow use it on rails style.
The problem is use something like :removed, :new, etc isn’t allowed because rails always expect ASC or DESC for param for order, do u get my point? I haven’t any exp with rails core, but is that something that should be allowed if I open a PR? and that’s something for a first-time traveler implements?