2017-05-18 55 views
0

在我的模型中,我有這種方法,它將一個對象的last_name和first_name列並將它們連接成一個字符串。在範圍中按模型方法排序

def name 
    last_name + " " + first_name 
end 

我想定義一個範圍,可以通過該方法對我的對象進行排序。如何使用我的方法去做這件事?我不想定義一些按姓氏排序的範圍,然後按範圍中的first_name定義(如果甚至可能的話)。我的理解是,你只能在rails框架中的實際列上作用域?那是不正確的?

以下是我寫的內容,但顯然不適用,因爲我的AdminUser表中沒有name字段。不知道爲什麼第二個不起作用,但我猜:name_field將無法​​正常工作,因爲它實際上不是作爲列的模型/數據庫。

scope :sorted, lambda { order("name ASC")} 
scope :sorted, lambda { :name_field => name, order("name_field ASC")} 
+0

看到這個問題https://stackoverflow.com/questions/18295778/rails-4-order-by-virtual-attribute – fangxing

回答

2

遺憾的是,不可能直接做在Ruby/Rails的到SQL。你可以實現你想要的方式有兩種

可以將所有用戶加載到內存中,並對其進行排序在Ruby中

User.all.to_a.sort_by(&:name) 

或者你可以在SQL這樣

ORDER BY CONCAT(users.last_name, ' ', users.first_name) ASC; 

定義順序在Rails中,您需要執行以下操作:

scope :sorted, -> { 
    order("CONCAT(users.last_name, ' ', users.first_name) ASC") 
} 

請注意,這可能無法在DB之間移植。

+0

真棒!謝謝 :) – PianoFingers