Skip to content

Instantly share code, notes, and snippets.

@chiastolite
Last active August 18, 2020 16:25
Show Gist options
  • Save chiastolite/f46f78e2176d3920ff4b86d1c910fa88 to your computer and use it in GitHub Desktop.
Save chiastolite/f46f78e2176d3920ff4b86d1c910fa88 to your computer and use it in GitHub Desktop.
こんなのどうやるんだけ
FooModel.pluck(:hoge_id, :id)
# => [[1, 1], [1, 2], [2, 3], [3, 4], [3, 5]]
# ↑これを↓こんな風にhoge_id毎にまとめたい
# => {1 => [1, 2], 2 => [3], 3 => [4, 5]}
@yancya
Copy link

yancya commented Aug 1, 2016

FooModel.
  group(:hoge_id).
  select("hoge_id, ARRAY_AGG(id) AS ids").
  reduce({}) { |acc, fm| acc.tap { |_acc| _acc[fm.hoge_id] = fm.ids } }

結局長くなって辛い

@yancya
Copy link

yancya commented Aug 1, 2016

FooModel.
  group(:hoge_id).
  select("hoge_id, ARRAY_AGG(id) AS ids").
  tap { |r| break r.map(&:hoge_id).zip(r.map(&:ids)).to_h }

詰め替えないなら、こうw

@chiastolite
Copy link
Author

FooModel.pluck(:hoge_id, :id).each_with_object(Hash.new{|h, k| h[k] = [] } ) { |(k, v), h| h[k] << v}

@pupupopo88
Copy link

FooModel.pluck(:hoge_id, :id).each_with_object({}){|v, h| (h[v[0]] ||= []) << v[1] }

@takkanm
Copy link

takkanm commented Aug 18, 2020

FooModel.pluck(:hoge_id, :id).group_by(&:first).map { |k,v| [k, v.map(&:last)] }.to_h

@sinsoku
Copy link

sinsoku commented Aug 18, 2020

FooModel.pluck(:hoge_id, :id).then { |x| x.to_h { |k, v| [k, x[k] || v] }
FooModel.pluck(:hoge_id, :id).then { |x| x.to_h { [_1, x[_1] || _2] }

追記: これ動き違うので、ダメですね...

@azihsoyn
Copy link

FooModel.pluck(:hoge_id, :id).inject({}){|ret, e| (ret[e[0]] ||= []) << e[1]; ret}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment