2011-01-06 307 views
30

我在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} 

感谢您的帮助。

+3

sort_by!不是红宝石1.8.x或红宝石1.9.1;它被添加到红宝石1.9.2。 – carols10cents 2011-02-18 21:08:45

回答

27

我发现,从here奏效的方法一致。我不明白什么是“&”符号在做什么 - 也许它在我的情况shorthad的“对象”,因为“:名字”是组成数组对象的属性。

users = users.sort_by &:lastname 

注意:我没有承诺为什么,但破坏性的版本将无法正常工作。它产生一个“未定义的方法sort_by!”为#” errror:

users.sort_by! &:lastname 
+4

“&”是“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

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 } 
+0

谢谢,我收到了“评估nil.sort时发生的错误!”错误(我将'姓名'更改为'姓氏')。看起来这个例子没有考虑到'lastname'是User模型的一个属性(其中用户是一个User对象的数组)。 – Reno 2011-01-06 02:40:28

+0

如果你的错误是“nil.sort!”问题是那种即@users的接收器是零。首先解决。 – 2011-01-06 07:35:45

+0

谢谢。 @users(或在我的情况'用户')不是零。我很确定,因为上面的例子是针对数组的对象,而不是这些数组对象中的属性。这种方法确实有效(我相信'&'代表'object'):users = users.sort_by&:lastname – Reno 2011-01-06 13:22:41

15

这可能是因为你有|User|User是一类。尝试将其更改为一个未使用的变量的名称,如u,得到:

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

在管道之间的术语是每个项目被存储在变量的名称,因为它穿过,而不是的类型你得到的对象。这是相同的其他的Ruby块,像do || end,或者任何其他{||}式的块。

+0

谢谢,这虽然没有奏效。它返回了一个“未定义的方法'sort_by!'for#“eror – Reno 2011-01-06 02:26:11

+0

对不起〜^^;我不确定我能提出什么更多的建议,因为我已经进入Ruby/Rails世界已经有一段时间了,很高兴看到你有所作为,尽管! – Groxx 2011-01-07 22:08:48

+0

@reno你有一个未定义的方法'sort_by!',因为你正在尝试对一个对象进行排序,'sort!'只能在一个对象集合上工作(例如对象数组) – adarsh 2013-06-08 16:19:18

2

你可以尝试把订单子句中使用“的has_many:用户”,你有你的集团模式

+0

像一个魅力工作 - 谢谢! – Reno 2011-01-06 13:11:01

相关问题