This blog is part of our Rails 5.1 series.
Rails 5.0 provides mattr_accessor to define class level variables on a per thread basis.
However, the variable was getting shared with child classes as well. That meant when a child class changed value of the variable, then its effect was seen in the parent class.
class Player
thread_mattr_accessor :alias
end
class PowerPlayer < Player
end
Player.alias = 'Gunner'
PowerPlayer.alias = 'Bomber'
> PowerPlayer.alias
#=> "Bomber"
> Player.alias
#=> "Bomber"
This isn't the intended behavior as per OOPS norms.
In Rails 5.1
this problem was resolved. Now a
change in value of thread_mattr_accessor in child class will not affect value
in its parent class.
class Player
thread_mattr_accessor :alias
end
class PowerPlayer < Player
end
Player.alias = 'Gunner'
PowerPlayer.alias = 'Bomber'
> PowerPlayer.alias
#=> "Bomber"
> Player.alias
#=> "Gunner"

Written byMohit Natoo
Related blogs
- 01Rails 5.1 stops loading all records on Model.all#inspectNovember 14, 2017 · Mohit Natoo
- 02Rails 5.1 enhances ActiveSupport::TimeZone.country_zonesJuly 18, 2017 · Narendra Rajput
- 03Rails 5.1 dropped jQuery dependency in default stackJune 20, 2017 · Neeraj Singh
- 04Rails 5.1 adds delegate_missing_toMay 30, 2017 · Neeraj Singh