web-dev-qa-db-ja.com

rubyでsort_byを使用して配列をアルファベット順にソートするにはどうすればよいですか?

メンバーシップの配列があります。各メンバーシップにはグループがあります。このメンバーシップの配列をグループの名前で並べ替える必要があります。私はさまざまな方法を試しましたが、最新の方法は次のとおりです。

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

ただし、これは名前でソートされません。配列をランダムにソートしているようです。

  • メンバーシップbelongs_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 | m.group.id}

Group.idに基づいて配列を並べ替えるので、アルファベット順の並べ替えと関係があるのでしょうか?

どんな助けでも大歓迎です。

29
Brian Weinreich

うわー、これに非常に長い間苦労した後、私は私の問題が単純なものであることに気づきました。 group.nameでソートしていましたが、グループ名の一部は大文字で、一部は小文字で、すべてが破棄されていました。すべてをダウンケースに変換するとうまくいきました。

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

ソート方法はオプションですか?

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

あなたのコードがどのように機能しているかわかりません。 m.group.nameを使用して配列のハッシュにアクセスできません

動作する構文は次のとおりです

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