2017-05-18 22 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