【问题标题】:How do you sort an array alphabetically using sort_by in ruby?如何在 ruby​​ 中使用 sort_by 按字母顺序对数组进行排序?
【发布时间】:2012-07-16 21:06:59
【问题描述】:

我有一系列会员资格。每个成员都是一个组。我需要按组名对这个成员资格数组进行排序。我尝试了很多不同的方法,最新的方法是这样的:

@memberships.sort_by! { |m| m.group.name }

但是,这不是按名称排序的。它似乎是对数组进行随机排序。

  • 成员属于_to :group
  • 组 has_many :memberships

@memberships 等于:

[
  {
  id: 2141,
  user_id: 491,
  group_id: 271,
  member_type: "member",
    group: {
      id: 271,
      name: "Derek's",
      privacy: "open",
      bio_image_url: "/bio_images/medium/missing.png?1340285189",
      member_count: 1,
      upcoming_checkins_count: 0
    }
  },
  {
  id: 2201,
  user_id: 221,
  group_id: 291,
  member_type: "member",
    group: {
      id: 291,
      name: "Rounded Developement",
      privacy: "closed",
      bio_image_url: "/groups/medium/291/bioimage.jpg?1340736175",
      member_count: 7,
      upcoming_checkins_count: 0
   }
}
]

注意:这确实有效--> @memberships.sort_by! { |米| m.group.id }

它将根据 group.id 对数组进行排序,所以它可能与按字母顺序排序有关?

任何帮助将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ruby arrays sorting enumerable


    【解决方案1】:

    哇,在为此苦苦挣扎了很长时间后,我意识到我的问题很简单。我是按 group.name 排序的,但有些组名是大写的,有些是小写的,这一切都被抛弃了。将所有内容都转换为小写字母效果很好。

    @memberships.sort_by!{ |m| m.group.name.downcase }
    

    【讨论】:

    • 在系统允许的时候奖励自己。
    • 小写是要走的路+1
    • @alcor 很高兴我能帮上忙!
    【解决方案2】:

    排序方法是一种选择吗?

    ary.sort{ |a,b| a[:group][:name] <=> b[:group][:name] }
    

    【讨论】:

    • 我也试过了.. @memberships.sort { |a,b| a.group.name &lt;=&gt; b.group.name } 仍然不起作用。
    • 忘记了嵌套...我通过添加父组键进行了更正
    • 好吧,也许这就是问题所在——我没有提到。当我执行 a.group.name 时,我正在执行成员资格和组表之间的连接。那么,这会对结果排序产生影响吗?因为它仍然无法使用更新的代码。
    • 所以您不是在对生成的哈希数组进行排序,而是对 ActiveRecord 对象进行排序,对吗?也许尝试使用“订单”Membership.joins(:groups).order("groups.name")
    • 我最终弄明白了。这是一个愚蠢的问题。我没有意识到排序没有考虑大小写。所以我可以弄清楚为什么它看起来像这样:[Ash, Bob, Jim, anna, kim] – 我最终按小写排序。感谢您的帮助(很抱歉用这种愚蠢的事情打扰您!)
    【解决方案3】:

    我看不到您的代码是如何工作的。我无法使用 m.group.name 访问数组中的哈希值

    这是一个有效的语法

    @memberships.sort_by!{ |m| m[:group][:name] }
    

    【讨论】:

    • 啊,我想我应该修改我的问题。当我做 m.group 时,我正在执行 sql join
    • 无论如何,这仍然不能正确按名称排序。它似乎是随机的(我确定它的疯狂有一种方法)。
    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    相关资源
    最近更新 更多