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

Ren*_*eno 35 ruby-on-rails

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

@group= Group.find(params[:id])
Run Code Online (Sandbox Code Playgroud)

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

<%= render :partial=>"user_list", :locals=>{:users=>@group.users} %>
Run Code Online (Sandbox Code Playgroud)

传递给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
Run Code Online (Sandbox Code Playgroud)

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

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

 users.sort_by! {|User| User.lastname}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

Ren*_*eno 36

我发现了一种可以在这里工作的方法.我不明白"&"符号在做什么 - 也许它是"对象"的简称,因为在我的情况下":lastname"是构成数组的对象的属性.

users = users.sort_by &:lastname
Run Code Online (Sandbox Code Playgroud)

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

users.sort_by! &:lastname
Run Code Online (Sandbox Code Playgroud)

  • "&"是"to_proc"方法的简写.在符号上,to_proc实质上将它转换为在传入的任何内容上按名称调用该方法.一个简短的解释:http://pragdave.pragprog.com/pragdave/2005/11/symbolto_proc.html(请注意,这很旧,它是内置于1.9及更高版本,IIRC,并在旧版本中由Rails添加) (4认同)

Gro*_*oxx 15

这可能是因为你|User|什么时候User上课了.尝试将其更改为未使用的变量名称,例如u,获取:

 users.sort_by! {|u| u.lastname}
Run Code Online (Sandbox Code Playgroud)

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