如何通过对象的属性对对象数组进行排序?
我在CONTROLER执行该查询和所述“组”模型的has_many用户正在使用如何通过对象的属性对对象数组进行排序?
@group= Group.find(params[:id])
@group来呈现该部分(部分转储组的用户到一个表)
<%= render :partial=>"user_list", :locals=>{:users=>@group.users} %>
局部变量“用户”传递给部分是用户对象的阵列;
- !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}
感谢您的帮助。
我发现,从here奏效的方法一致。我不明白什么是“&”符号在做什么 - 也许它在我的情况shorthad的“对象”,因为“:名字”是组成数组对象的属性。
users = users.sort_by &:lastname
注意:我没有承诺为什么,但破坏性的版本将无法正常工作。它产生一个“未定义的方法sort_by!”为#” errror:
users.sort_by! &:lastname
“&”是“to_proc”方法的简称,在符号上,to_proc基本上将它转换为通过任何传入的名称调用该方法。简短说明:http://pragdave.pragprog.com/pragdave /2005/11/symbolto_proc.html(请注意,这很旧,它内置于1.9及以上版本,IIRC,并由旧版本的Rails添加) – Groxx 2013-11-05 20:54:13
见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 }
谢谢,我收到了“评估nil.sort时发生的错误!”错误(我将'姓名'更改为'姓氏')。看起来这个例子没有考虑到'lastname'是User模型的一个属性(其中用户是一个User对象的数组)。 – Reno 2011-01-06 02:40:28
如果你的错误是“nil.sort!”问题是那种即@users的接收器是零。首先解决。 – 2011-01-06 07:35:45
谢谢。 @users(或在我的情况'用户')不是零。我很确定,因为上面的例子是针对数组的对象,而不是这些数组对象中的属性。这种方法确实有效(我相信'&'代表'object'):users = users.sort_by&:lastname – Reno 2011-01-06 13:22:41
这可能是因为你有|User|
时User
是一类。尝试将其更改为一个未使用的变量的名称,如u
,得到:
users.sort_by! {|u| u.lastname}
在管道之间的术语是每个项目被存储在变量的名称,因为它穿过,而不是的类型你得到的对象。这是相同的其他的Ruby块,像do || end
,或者任何其他{||}
式的块。
sort_by!不是红宝石1.8.x或红宝石1.9.1;它被添加到红宝石1.9.2。 – carols10cents 2011-02-18 21:08:45