按范围中的模型方法排序

时间:2017-05-18 00:54:04

标签: ruby-on-rails

在我的模型中,我有这个方法,它接受一个对象的last_name和first_name列,并将它们连接成一个字符串。

def name
  last_name + " " + first_name
end

我想定义一个可以通过该方法对对象进行排序的范围。怎么会用我的方法去做呢?我不想定义一些首先按last_name排序的范围,然后定义范围中的first_name(如果可能的话)。我的理解是你只能在rails框架中的实际列上进行范围调整?这是不正确的吗?

这是我写的内容,但显然不起作用,因为我的name表中没有AdminUser字段。不知道为什么第二个不起作用,但我猜测:name_field不会起作用,因为它实际上不在模型/数据库中作为列

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

1 个答案:

答案 0 :(得分: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之间移植。