🐈
別々に取得した値を同じ値を元に結合【Rails、メモ】
目的
- 別々に取得した値を、同じキーを元に結合したい
状況
- 募集(job)と応募(entry)をそれぞれ取得。(前提:SQLでまとめれない)
- どちらも職種毎にグルーピングして集計している。(データ取得、集計メソッドなどは省略)
- 取得データは
ActiveRecord::Relation
(配列) - 二つのデータをさらに職種毎にまとめたい。
データ取得
# 募集
jobs = Job.select("求人数", "職種").group("職種")
# 応募
entries = Entry.select("応募数", "職種").group("職種")
目指す形としては以下のような形。
職種をハッシュキーにして、各行をvalueとして持つ。
目指す形
{"004調理師"=>{"求人数"=>4927, "応募数"=>4820}, "07開発技術者"=>{"求人数"=>3000, "応募数"=>50}}
必要な手順は2つだけ。
-
ActiveRecord::Relation
(配列)を職種をハッシュキーにして、各行をvalueとして持つハッシュに加工 - 結合
ハッシュ化
ハッシュ化
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