5

मैं इस भूमिका के लिए Enum परिभाषित किया गया है:कस्टम Enum के आधार पर आदेश को महत्व देता

enum role: {ordinary: 0, manager: 1, admin: 2} 

मैं इस क्रम में वस्तुओं का संग्रह ऑर्डर करने के लिए पसंद आया होगा:

admin (first all admins) 
ordinary (then all ordinaries) 
manager (and lastly all managers) 

बिल्कुल यह संभव है ?

उत्तर

5

इस के लिए एक समाधान:

class YourModel < ActiveRecord::Base 
    ROLE_ORDERS = [2, 0, 1] 

    scope :order_by_role, -> { 
    order_by = ['case'] 
    ROLE_ORDERS.each_with_index do |role, index| 
     order_by << "WHEN role=#{role} THEN #{index}" 
    end 
    order_by << 'end' 
    order(order_by.join(' ')) 
    } 
end 

तो आपकी क्वेरी इस तरह सरल हो जाएगा:

YourModel.order_by_role 

उत्पन्न क्वेरी है:

SELECT * from your_models 
ORDER BY (CASE 
      WHEN role=2 THEN 0 
      WHEN role=0 THEN 1 
      WHEN role=1 then 2 
      END 
     ) 

this

से अच्छा संदर्भ
+0

हम्म, मुझे यह त्रुटि (दुर्भाग्य से बहुत अधिक बढ़ मुझे पार्स करने के लिए के लिए) हो रही है: ActiveRecord :: StatementInvalid: PG :: SyntaxError: ERROR: इनपुट लाइन 1: ... ase जब भूमिका = 2 फिर 0 जब भूमिका = 0 फिर 1 जब भूमिका = 1 फिर 2 ^ : चुनें " उपयोगकर्ता "। *" उपयोगकर्ताओं "से आदेश जब तक भूमिका = 2 फिर 0 जब भूमिका = 0 तब 1 जब भूमिका = 1 फिर 2 –

+0

अरे, मैं 'CASE' कथन के अंत में 'END' जोड़ना भूल गया, बस इसे –

+0

सही करें यह बहुत शानदार है। बदसूरत लग रहा है, लेकिन एक अन्यथा बहुत चिपचिपा मुद्दे के लिए आईएमओ महान समाधान। –

0

this answer के लिए धन्यवाद मैं इस के साथ आया था:

order("role = 0 DESC, role = 1 DESC, role = 2 DESC") 

या वैकल्पिक तर्क के साथ एक गुंजाइश के रूप में,:

scope :order_by_roles, -> (first = :admin, second = :ordinary, third = :manager) { 
    order("role = #{User.roles[first]} DESC, role = #{User.roles[second]} DESC, role = #{User.roles[third]} DESC") 
} 
संबंधित मुद्दे