Rails の counter_cache のカウンターが readonly になるタイミング

みなさんこんにちは。
去年は東京でもどっさり雪が降りましたけど、今年はどうでしょう?
雪国育ちの僕としては、大雪を期待してしまいます!

さて、ここ数回の記事で Rails の counter_cache と redis-objects を組み合わせたカウンターを作って紹介してみたのですが、
この記事を書きながら counter_cache を触っていて、「アレ!?手動で counter 値を変更出来たり変更出来なかったりするよ!?」と気がついたので共有したいと思います。

そもそもは僕が rails console で counter 値をいじってみたら、変更出来てしまったところから始まります。このログの通り...
※以下の動作確認で使ったマイグレーションとモデルついては、記事の最後に乗せてあります。

で、僕は「なんだ変更出来ちゃうのか」と思い込んで使っていたのですが、実はそうでもなくて...

「今度は変更されてない!」となったわけなんですよ。
いったいどういうことなのか、気を取り直して調べてみました。恐らく attribute が readonly になっているような気がするので確認してみます。

ということで belongs_to で :counter_cache 指定した attribute を呼び出すまで、カウント値が入る attribute は readonly にならないようです。最初から readonly にはなっていないんですね。

最初に上書き出来たんで、そのまま上書き出来るものだと思っていたら、途中で動作が変わって「アレ!?」となったので共有しておきます。

以下は動作確認で使ったマイグレーションとモデルです :
それではみなさん、最近はインフルエンザも流行しているようですので、お体にお気をつけて。ご自愛下さい。

菊池