LoginSignup
2
0

More than 1 year has passed since last update.

RubyのHashは引数が多いとスタックオーバーフローする

Last updated at Posted at 2020-08-26

ActiveRecordを使い、key=>valueのHashを作成していた。

  • コメントで指摘いただいた箇所について修正しました。
    指摘箇所である .map { |x| x } ですが、 Mysql2::Result に対しては直接 .flatten が使えないため .to_a の代わりとして呼び出していました。
@users = Hash.send :[], *ActiveRecord::Base.connection.execute('SELECT `id`, `name` FROM `users`').to_a.flatten
@users[1]
# => "ユーザー1"

Hash[*Array] をしているため、.execute で取得してくるレコード数が一定を超すとスタックオーバーフローとなる。

records.size
 => 10000
Hash.send :[], *records.flatten
SystemStackError: stack level too deep

ActiveRecordの使い方やHashの作り方の両方に問題があるため修正

@users = User.pluck(:id, :name).to_h
@users[1]
# => "ユーザー1"

.pluckで必要なカラムを取得し .to_h でHash化することで解決しました。

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0