Ruby on rails 如何根据对象的属性对对象数组进行排序?

Ruby on rails 如何根据对象的属性对对象数组进行排序?,ruby-on-rails,Ruby On Rails,我在一个控制器中执行这个查询,“组”模型有很多用户 @group= Group.find(params[:id]) @组用于呈现此分部(分部将组的用户转储到表中) 用户数组如何按“lastname”排序?我试过几种不同的方法,但都没有成功。试图按数组中的对象属性排序会让我感到困惑。此外,我不明白如何在查询中使用:order(如何:不是对组排序,而是对每个组的用户排序) 也许我并没有正确地引用对象的名称(“用户”)?如果它产生“无方法”错误(或者如果在没有方法的情况下使用“排序依据”,则会产生动

我在一个控制器中执行这个查询,“组”模型有很多用户

@group= Group.find(params[:id])
@组用于呈现此分部(分部将组的用户转储到表中)

用户数组如何按“lastname”排序?我试过几种不同的方法,但都没有成功。试图按数组中的对象属性排序会让我感到困惑。此外,我不明白如何在查询中使用:order(如何:不是对组排序,而是对每个组的用户排序)

也许我并没有正确地引用对象的名称(“用户”)?如果它产生“无方法”错误(或者如果在没有方法的情况下使用“排序依据”,则会产生动态常量赋值错误),那么这似乎应该可以工作:

谢谢您的帮助。

请参阅

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

这可能是因为当
User
是一个类时,您就有了
|User
。尝试将其更改为未使用的变量名,如
u
,以获得:

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

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

您可以尝试在组模型中的“has|mu many:users”行中放置order子句。我不明白“&”符号在做什么——可能是“object”的缩写,因为在我的例子中:lastname是组成数组的对象的属性

users = users.sort_by &:lastname
注:我不明白为什么,但破坏性的版本是行不通的。它为#生成一个“未定义的方法`sort_by!””错误:

users.sort_by! &:lastname

谢谢,不过没用。它为#返回了一个“未定义的方法`sort_by!””erorSorry关于^^;我不确定我还能提出什么建议,我已经有一段时间没有进入Ruby/Rails的世界了。不过,很高兴看到你找到了工作@雷诺你有一个未定义的方法
排序依据因为您正在尝试对对象进行排序<代码>排序将仅对对象集合(例如对象数组)起作用。谢谢,我得到了一个“计算nil.sort时出错!”错误(我将“name”更改为“lastname”)。该示例似乎没有考虑到“lastname”是用户模型的一个属性(其中用户是一组用户对象)。如果错误为“nil.sort!”,则问题在于排序的接收者,即@users为nil。先解决这个问题,谢谢@用户(或者在我的例子中是“用户”)不是零。我很确定,因为上面的例子是针对数组的对象,而不是那些数组对象中的属性。这个方法确实有效(我相信“&”代表“对象”):users=users.sort\u by&:lastname非常有效-谢谢!排序!不在ruby 1.8.x或ruby 1.9.1中;它是在ruby 1.9.2中添加的。“&”是“to_proc”方法的缩写。在符号上,to_proc本质上将其转换为对传入的任何对象按名称调用该方法。一个简短的解释:(请注意,这是非常古老的,它内置于1.9及以上版本,IIRC,并由Rails在旧版本中添加)破坏性方法在这里不起作用,因为用户是活动记录关系,而不是数组。这两种方法都有相当大的重叠,但并不完全。而且你不想在活动记录关系上使用破坏性的方法。
@users.sort! { |a,b| a.name.downcase <=> b.name.downcase }
 users.sort_by! {|u| u.lastname}
users = users.sort_by &:lastname
users.sort_by! &:lastname