こんにちは、hachi8833です。BigBinaryシリーズは、Rails 5.1記事と、それに関連するRails 5時代の記事をお送りいたします。
[Rails5]モジュールやクラスレベルの変数をスレッドベースで作成する機能(翻訳)
概要
- 元記事: Rails 5.1 does not share thread_mattr_accessor variable with subclass(米国BigBinary社のブログより)
- 著者: Mohit Natoo
以下の環境で確認しました。
- Rails 5.1.1 + Ruby 2.4.1
- Rails 5.0.2 + Ruby 2.4.1
- Rails 5.0.0 + Ruby 2.3.3
thread_mattr_accessorの変数はサブクラスと共有されないようになった(翻訳)
Rails 5.0から、クラス変数をスレッドベースで定義するmattr_accessor
が提供されています。
しかし、定義した変数は子クラスとも共有されるという問題がありました。つまり、子クラスで変数を変更すると以下のように親クラスの変数も変更されてしまいます。
class Player
thread_mattr_accessor :alias
end
class PowerPlayer < Player
end
Player.alias = 'Gunner'
PowerPlayer.alias = 'Bomber'
PowerPlayer.alias
# "Bomber"
Player.alias
# "Bomber"
これはオブジェクト指向的に望ましい動作ではありません。
この問題はRails 5.1で修正されました。thread_mattr_accessor
の値を子クラスで変更しても親クラスの値には影響しません。
class Player
thread_mattr_accessor :alias
end
class PowerPlayer < Player
end
Player.alias = 'Gunner'
PowerPlayer.alias = 'Bomber'
PowerPlayer.alias
# "Bomber"
Player.alias
# "Gunner"
訳注: この修正は5.0-stableにもバックポートされています。
関連記事
- [Rails 5] モデルの継承元がActiveRecord::BaseからApplicationRecordに変更された
- [Rails 5] フォームごとに異なるCSRFトークンを受け取れるようになった(翻訳)
- [Rails 5] developmentモードのアセットログはデフォルトでオフになる(翻訳)
- [Rails 5] rails dev:cacheコマンドでdevelopmentモードでのキャッシュを簡単にオン・オフできる
- [Rails 5] コントローラの制約を受けずに任意のビューテンプレートをレンダリングする
- [Rails 5] rakeタスクがrailsコマンドでもできるようになった
- [Rails 5] Rails 5の新フレームワークデフォルト設定ファイルでアップグレード作業を軽減する
- [Rails 5] マイグレーション時にデータベースのカラムにコメントを追加する