2012-07-17 115 views
26

我有一个会员资格数组。在每个成员中是一个组。我需要按照组的名称对这个成员资格数组进行排序。我尝试了很多不同的方法,最新的方法是:如何在Ruby中按字母顺序排序使用sort_by?

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

但是,这并不按名称排序。它似乎是随机排列数组。

  • 会员belongs_to的:组
  • 组的has_many:成员身份

@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 | m.group.id}

它会根据group.id排序数组,所以也许它与按字母顺序排序有关?

任何帮助将不胜感激。

回答

62

哇,这个挣扎极长的时间后,我意识到我的问题是一个简单的问题。我正在按group.name进行排序,但一些组名称是大写字母,有些字母是较低的,这会把它全部扔掉。将所有内容都转换为英文,效果很好。

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

当系统允许你时,给自己一个答案。 – 2012-07-17 22:28:03

+0

会做。还得等待一天...... – 2012-07-18 14:38:22

+0

落差是要走的路+1 – earlonrails 2013-03-26 21:35:31

3

排序方法是一个选项吗?

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

我试过,以及.. '@memberships.sort {| A,B | a.group.name <=> b.group.name}'仍然不起作用。 – 2012-07-17 21:28:40

+0

忘记嵌套...我通过添加父组密钥更正了 – Angelo 2012-07-17 21:31:28

+0

好吧,也许这是问题 - 我没有提到。当我做a.group.name时,我正在执行成员和组表之间的连接。那么,这会对结果排序产生影响吗?因为它仍然无法使用更新的代码。 – 2012-07-17 21:33:55

1

我看不到您的代码是如何工作的。使用m.group.name

我无法访问阵列中的散列这里有一个工作的语法

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

啊,我想我应该修改我的问题。当我做m.group我在任何情况下执行一个sql加入 – 2012-07-17 21:30:46

+0

,那仍然不正确按名称排序。它似乎是随机的(我敢肯定,有一种方法是它的疯狂)。 – 2012-07-17 21:38:34