HAL99さんの[Rails]仮想カラムの作り方を見てcattr_accessorの存在を知った!!
その後、ActiveRecordのコードを読み始めたら、cattr_accessorのコードがちらほら出てきたので気になって調べて見た。
ソースコードを、探して見たらactive_support/core_ext/class/attribute_accessors.rbにあった!
どうやらこれは、クラス変数を定義するためのものらしい。
クラス変数をインスタンス変数ちっくにアクセスできるものも定義してくれる。
早速実験!!
cattr_sample.rb
require 'rubygems'
require 'active_support'
class Hoge
# クラス変数fooを定義
cattr_accessor :foo
end
# クラス変数だけどインスタンス変数のようにアクセスできる
h = Hoge.new
h.foo = "hogehoge"
puts h.foo # => hogehoge
# 別のインスタンスでも同じように設定できる
h2 = Hoge.new
puts h2.foo # => hogehoge
h2.foo = "mogemoge"
puts h2.foo # => mogemoge
# もちろんクラス変数としてもアクセスできる
puts Hoge.foo # => mogemoge
これをやって思った。
仮想カラムの作り方に書いてある使い方は、複数のインスタンスがあるとガクガクブルブルなことに…。