Model.pluck(:id)रिटर्न मानते हुए [1,2,3,4]और आप का आदेश चाहते हैं[2,4,1,3]
ORDER BY CASE WHENएसक्यूएल क्लॉज का उपयोग करने के लिए अवधारणा है । उदाहरण के लिए:
SELECT * FROM colors
ORDER BY
CASE
WHEN code='blue' THEN 1
WHEN code='yellow' THEN 2
WHEN code='green' THEN 3
WHEN code='red' THEN 4
ELSE 5
END, name;
रेल में, आप एक समान संरचना का निर्माण करने के लिए अपने मॉडल में एक सार्वजनिक विधि पाकर इसे प्राप्त कर सकते हैं:
def self.order_by_ids(ids)
if ids.present?
order_by = ["CASE"]
ids.each_with_index do |id, index|
order_by << "WHEN id='#{id}' THEN #{index}"
end
order_by << "END"
order(order_by.join(" "))
end
else
all # If no ids, just return all
end
फिर करो:
ordered_by_ids = [2,4,1,3]
results = Model.where(id: ordered_by_ids).order_by_ids(ordered_by_ids)
results.class # Model::ActiveRecord_Relation < ActiveRecord::Relation
इस बारे में अच्छी बात है। परिणाम ActiveRecord संबंधों के रूप में वापस कर रहे हैं (अनुमति देता है आप की तरह विधियों का उपयोग करने last, count, where, pluck, आदि)