ActiveSupport::PerThreadRegistryでThread.currentより安全にグローバルな値を保持する╭( ・ㅂ・)و ̑̑

Railsでグローバルデータを保持したいときに、Thread.currentを使えば簡単ですよね

Thread.current[:current_user] = user
Thread.current[:current_user] #=> user

僕も気軽に使ってましたが、最近こんな記事を見つけました。

Better globals with a tiny ActiveSupport module - Weissblog

Thread.currentを使わない方が良い理由

  • キーがかぶってしまったらデータを上書きされるで!
  • 構造化されてないで!

ActiveSupport::PerThreadRegistryを使うと同じcurrent_userでもデータを担保できます

class RequestRegistry
  extend ActiveSupport::PerThreadRegistry
  attr_accessor :current_user
end

class PhoneNumberApiRegistry
  extend ActiveSupport::PerThreadRegistry
  attr_accessor :current_user
end

RequestRegistry.current_user = user1
RequestRegistry.current_user #=> user1

PhoneNumberApiRegistry.current_user = user2
PhoneNumberApiRegistry.current_user #=> user2

てな感じです

ここらを参考にすれば良いみたいです

rails/runtime_registry.rb at master · rails/rails · GitHub

rails/explain_registry.rb at master · rails/rails · GitHub

Happy Hacking٩( ‘ω’ )و