5

Tôi có điều này được xác định Enum cho vai trò:trật tự tùy chỉnh dựa trên Enum giá trị

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

tôi sẽ thích để đặt hàng một bộ sưu tập của các đối tượng theo thứ tự sau:

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

Đây có phải là có thể ở tất cả ?

Trả lời

5

Một giải pháp cho việc này:

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 

Sau đó truy vấn của bạn sẽ được đơn giản như thế này:

YourModel.order_by_role 

Truy vấn được tạo ra là:

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

Tốt tham khảo từ this

+0

Hm, tôi nhận được lỗi này (tiếc là quá cao đối với tôi để phân tích): ActiveRecord :: StatementInvalid: PG :: Cú phápError: ERROR: lỗi cú pháp ở cuối đầu vào LINE 1: ... ase KHI vai trò = 2 THEN 0 KHI vai trò = 0 THÌ 1 KHI vai trò = 1 THEN 2 ^ : CHỌN " người dùng ". * FROM" người dùng "ORDER BY case KHI vai trò = 2 THÌ 0 KHI vai trò = 0 THÌ 1 KHI vai trò = 1 THEN 2 –

+0

Này, tôi quên thêm 'END' vào cuối câu lệnh' CASE', chỉ cần sửa nó –

+0

Điều này khá là tuyệt vời. Trông xấu xí, nhưng IMO giải pháp tuyệt vời đến một vấn đề khác rất dính. –

0

Nhờ this answer tôi đến với điều này:

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

Hoặc, như một phạm vi với đối số tùy chọn:

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") 
} 
Các vấn đề liên quan