如何通过对象的属性对对象数组进行排序?

时间:2011-01-06 00:57:19

标签: ruby-on-rails

我在控制器中执行此查询,而“组”模型has_many用户

@group= Group.find(params[:id])

@group用于呈现此部分(部分用户将组转移到表中)

<%= render :partial=>"user_list", :locals=>{:users=>@group.users} %>

传递给partial的局部变量'users'是一个User对象数组;

- !ruby/object:User 
  attributes: 
    updated_at: 2011-01-04 21:12:04
    firstname:  Bob
    lastname: Smith
    id: "15"
    group_id: "2"
    created_at: 2010-11-26 12:54:45

如何通过'lastname'对用户数组进行排序?没试过,我尝试了几种不同的方法。试图按照数组中的对象属性进行排序让我感到困惑。另外,我不知道如何通过以下方式执行此操作:查询中的顺序(如何:不是命令组而是命令每个组的用户)?

也许我没有正确引用对象的名称('用户')?看起来这应该是有效的,因为它会产生'无方法'错误(如果没有使用'sort_by',则会产生动态常量赋值错误!):

 users.sort_by! {|User| User.lastname}

感谢您的帮助。

4 个答案:

答案 0 :(得分:35)

我发现了一种适用于here的方法。我不明白“&amp;”是什么符号正在做 - 也许它是“对象”的缩写,因为在我的情况下“:lastname”是构成数组的对象的属性。

users = users.sort_by &:lastname

注意:我没有说明原因,但破坏性版本不起作用。它产生一个“未定义的方法`sort_by!'对于#“errror:

users.sort_by! &:lastname

答案 1 :(得分:30)

请参阅http://ariejan.net/2007/01/28/ruby-sort-an-array-of-objects-by-an-attribute/

@users.sort! { |a,b| a.name.downcase <=> b.name.downcase }

答案 2 :(得分:15)

这可能是因为|User|是一个班级时你已经User了。尝试将其更改为未使用的变量名称,例如u,以获取:

 users.sort_by! {|u| u.lastname}

管道之间的术语是每个项目存储在其中的变量的名称,而不是您所拥有的对象类型。这与其他Ruby块相同,例如do || end或任何其他{||}样式块。

答案 3 :(得分:2)

您可以尝试在群组模型中的“has_many:users”行中添加订单子句