【问题标题】:How to sort an array of objects by an attribute of the objects?如何按对象的属性对对象数组进行排序?
【发布时间】:2011-01-06 00:57:19
【问题描述】:

我正在控制器中执行此查询,并且“组”模型 has_many Users

@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

用户数组如何按“姓氏”排序?我已经尝试了几种不同的方法,但没有任何运气。试图按数组内的对象属性排序让我感到困惑。另外,我不明白如何在查询中使用 :order 来做到这一点(如何 :order 不是组,而是每个组的用户)?

也许我没有正确引用对象的名称(“用户”)?看起来这应该可以工作,因为它会产生“无方法”错误(或者如果在没有 ! 的情况下使用“sort_by”,则会产生动态常量分配错误):

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

感谢您的帮助。

【问题讨论】:

  • sort_by!不在 ruby​​ 1.8.x 或 ruby​​ 1.9.1 中;它是在 ruby​​ 1.9.2 中添加的。

标签: ruby-on-rails


【解决方案1】:

我找到了一种适用于here 的方法。我不明白“&”符号在做什么——也许它是“object”的简写,因为在我的例子中,“:lastname”是组成数组的对象的一个​​属性。

users = users.sort_by &:lastname

注意:我不明白为什么,但破坏性版本不起作用。它产生一个“未定义的方法‘sort_by!’对于 #" 错误:

users.sort_by! &:lastname

【讨论】:

  • "&" 是“to_proc”方法的简写。在符号上,to_proc 本质上将其转换为在传入的任何内容上按名称调用该方法。简短的解释:pragdave.pragprog.com/pragdave/2005/11/symbolto_proc.html(请注意,这是相当古老的,它在 1.9 及更高版本中内置,IIRC,并由 Rails 在旧版本)
  • 破坏性方法在这里不起作用,因为 users 是活动记录关系,而不是数组。两者都存在的方法有相当大的重叠,但并不完整。并且您不希望能够对活动记录关系使用破坏性方法。
【解决方案2】:

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 时出错!”错误(我将“姓名”更改为“姓氏”)。该示例似乎没有考虑到“姓氏”是用户模型的一个属性(其中用户是用户对象的数组)。
  • 如果您的错误是“nil.sort!”,则问题是排序的接收者,即@users 为 nil。先解决这个问题。
  • 谢谢。 @users(或者在我的情况下是“用户”)不是零。我很确定,因为上面的示例适用于数组对象,而不是这些数组对象内的属性。这种方法确实有效(我相信“&”代表“对象”):users = users.sort_by &:lastname
【解决方案3】:

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

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

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

【讨论】:

  • 谢谢,不过没用。它返回了一个“未定义的方法‘sort_by!’对于 #<0xec67978>
【解决方案4】:

您可以尝试在 Group 模型中的“has_many :users”行中添加一个 order 子句

【讨论】:

  • 像魅力一样工作 - 谢谢!
猜你喜欢
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
相关资源
最近更新 更多