###やりたいこと
railsで特定のカラム(country)の重複をカウント
countryだけを抽出し、グループごとに重複が多い順に並び替える
Usersテーブル
| id | country | name | グループ |
|---|---|---|---|
| 1 | 日本 | 戸田 | A |
| 2 | 韓国 | 李大浩 | A |
| 3 | アメリカ | トランプ | A |
| 4 | 日本 | 恵梨香 | A |
| 5 | 日本 | 芦田 | A |
| 6 | アメリカ | ガトリン | A |
| 7 | アイスランド | シェリー | B |
| 8 | プエルトリコ | ジョンソン | B |
| 9 | アイスランド | サリー | B |
######期待する出力
["日本","アメリカ","韓国"]#グループA ["アイスランド","プエルトリコ"]#グループB
###実践
sortやuniq、distinctなど色々調べたのですが、なかなか処理できません
今は長々とコードを書いている状況です
countryを配列に入れて、配列の中のcountryを数えようとしていますが進みません
他にいいやり方があればご教授願います
group = ["A","B"] a=0 country= [] 2.times do a = User.where(group: group[a]).pluck(:country) country << a ここから色々処理するもうまくいかず a+=1 end p country ##[["日本","韓国","アメリカ","日本","日本","アメリカ"],["アイスランド","プエルトリコ","アイスランド"]]
###追記
重複が何個あったかも処理しようとしています
よろしくお願いします
「今は長々とコードを書いている状況です」とはどのくらいですか?
私が作るとしてそれより短く出来るかどうか
group_by, map,sort,map ぐらいかかります。
rubyの2.7を使うとこれに使えるよいmethodができたのでもうちょい短くなりますが
すみません、消してしまいまいましたが途中段階で30行くらいは書いてました
countryを.instance_eval { uniq.sort_by {|x| count x}.reverse }で重複を除いて新しい配列に入れて
country[n].count(new_count[n][m])というように、地道に処理しています
country[Aグループ].count(日本)というように、ループで回してcountの引数を変えています
やはりこのくらい長い処理になるのでしょうか
まずSQLを組んでみてほしいかなぁ。
sqlだとそうとう難度高くないですか?
グループないなら私でもできそうですが、、、、
回答1件
あなたの回答
tips
プレビュー