在我的模型中,我有这个方法,它接受一个对象的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")}
答案 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之间移植。