2020.01.14

【Rails】データが重複しているカラムの個数を特定、ソートする

スポンサーリンク

データが重複しているカラムの個数を特定して、ソートする方法

 

対象カラムを配列で取得する

まずカラムを配列で取得します。そのためにはpluckメソッドを用います。このメソッドは対象カラムを配列で返してくれるものです。

実際にImageのidolnameカラムを配列として取得してみます。

block = Image.pluck(:idolname)
出力結果
["有浦柑奈", "有浦柑奈", "太田優", "大原みちる", "有浦柑奈", "太田優", "佐城雪美", "有浦柑奈", "佐城雪美", "佐城雪美"]

重複しているカラムごとにまとめる

次に出力された配列を重複しているカラムごとにまとめたいと思います。group_byとitselfを使うとうまく纏められるそうな。配列からハッシュになるっぽい。

block.group_by(&:itself)
出力結果
{"有浦柑奈"=>["有浦柑奈", "有浦柑奈", "有浦柑奈", "有浦柑奈"], "太田優"=>["太田優", "太田優"], "大原みちる"=>["大原みちる"], "佐城雪美"=>["佐城雪美", "佐城雪美", "佐城雪美"]}

うまくまとめられました!この時点でハッシュになってます。

 

ハッシュのvalueを数字に変換する

現時点でハッシュの中は {key => [value,value....]} となっているので、valueをひとまとめにして、それぞれ合計した数に直したいと思います。

色々ググってみたらtransform_valuesメソッドという便利メソッドを発見しました。これはハッシュの全ての値を変更できるメソッドのようです。早速使ってみることに。

hash_count = block.group_by(&:itself).transform_values(&:size)
出力結果
{"有浦柑奈"=>4, "太田優"=>2, "大原みちる"=>1, "佐城雪美"=>3}

valueの値が一括で変更できました!

hashを配列に変換する

先ほど出力したものをto_aを使って配列に変換していきます。to_aは簡単にいうと配列として返すやつです。

ary_count = hash_count.to_a
出力結果
[["有浦柑奈", 4], ["太田優", 2], ["大原みちる", 1], ["佐城雪美", 3]]

無事配列に直りました。あとは昇順降順のオプションを付け加えて終わりです!

 

配列内の値をソートする

sort_byでvalueの値を降順で表示させてみます。

ary_count.sort_by {|k,v| v}.reverse
出力結果
[["有浦柑奈", 4], ["佐城雪美", 3], ["太田優", 2], ["大原みちる", 1]]

無事降順に並び変わりました! reverseは逆順に並べかえるメソッドです。

次に配列の先頭から任意の数だけ抜き出してみます。

ary = ary_count.first(3)
出力結果
[["有浦柑奈", 4], ["佐城雪美", 3], ["太田優", 2]]
一気にまとめて記述するのって可読性的にあんまよくないのかな...?
<%= ary = ary_count.sort_by {|k,v| v}.reverse.first(3) %>

 

降順で取得した配列をViewに表示させる

現時点で二次元配列になっているので、特定の値をfirst(n)などで取得しようとすると配列一括りそのまま持ってきちゃうのでいらない要素も取得してしまう。いったいどうしたらいいんだ、とネットの海を漂っていたら解決策を発見しました!先人の知恵の偉大さに感謝。

digメソッドを使うと取得したい配列の要素を指定できるようになります。

今変数に入っている配列
ary = [["有浦柑奈", 4], ["佐城雪美", 3], ["太田優", 2]]
ary.dig(0,0)
出力結果
有浦柑奈

このように指定すれば余計な要素はついてこず、必要な要素のみ取り出すことができます。指定方法は下記参照

[ ["有浦柑奈", 4], ["佐城雪美", 3], ["太田優", 2] ]



[ [(0,0),(0,1)], [(1,0),(1.1)], [(2,0),(2,1)] ]

以上で終わりです!めっちゃ疲れました。。