🐈

別々に取得した値を同じ値を元に結合【Rails、メモ】

2022/02/19に公開

目的

  • 別々に取得した値を、同じキーを元に結合したい

状況

  • 募集(job)と応募(entry)をそれぞれ取得。(前提:SQLでまとめれない)
  • どちらも職種毎にグルーピングして集計している。(データ取得、集計メソッドなどは省略)
  • 取得データはActiveRecord::Relation(配列)
  • 二つのデータをさらに職種毎にまとめたい。
データ取得
# 募集
jobs = Job.select("求人数", "職種").group("職種")
# 応募
entries = Entry.select("応募数", "職種").group("職種")

目指す形としては以下のような形。
職種をハッシュキーにして、各行をvalueとして持つ。

目指す形
{"004調理師"=>{"求人数"=>4927, "応募数"=>4820}, "07開発技術者"=>{"求人数"=>3000, "応募数"=>50}}

必要な手順は2つだけ。

  1. ActiveRecord::Relation(配列)を職種をハッシュキーにして、各行をvalueとして持つハッシュに加工
  2. 結合

ハッシュ化

ハッシュ化
job_hash = Hash[jobs.map{|job| [job.職種, job.attributes]}]
# {"004調理師"=>{"求人数"=>4927}, "07開発技術者"=>{"求人数"=>3000}}
entry_hash = Hash[entries.map{|entry| [entry.職種, job.attributes]}]
# {"004調理師"=>{"応募数"=>4820}, "07開発技術者"=>{"応募数"=>50}

# attributesを使用しているため、 実際は以下のように職種も入れ子の中に入るが省略している。
# {"004調理師"=>{"求人数"=>4927, "職種"=>"004調理師"}

結合

結合
job_hash.deep_merge(entry_hash)
# {"004調理師"=>{"求人数"=>4927, "応募数"=>4820}, "07開発技術者"=>{"求人数"=>3000, "応募数"=>50}}
mergeの場合
job_hash.merge(entry_hash)
# {"004調理師"=>{"応募数"=>4820}, "07開発技術者"=>{"応募数"=>50}

Discussion