AR内のメソッドでself
を書くべきか書かないべきか悩んでいたのでここにメモ。
-
Ruby
のprivate
メソッドはレシーバー(hoge.method
の形)で呼び出せない- つまりAR内で
self.method
の形で書くとprivate
メソッドが呼び出せない。 - 自クラス内なら
public
もprivate
も特に意識する必要はなし。なのでself.hoges
やself.foo
などとself
を書く必要はない
- つまりAR内で
では、どいういうときにselfを付けるべきか
- クラスメソッドを作るとき(ARにクラスメソッド作りたいと思ったことはほぼない)
- カラムアトリビュートになんか代入するとき
def be_nil; self.hoge_id = nil; end
- 上記の場合
hoge_id = nil
にしてしまうとbe_nil
メソッド内のローカル変数hoge_id
がnilになってしまう。なのでARのカラムに相当するアトリビュートを更新することができない。ARが自動で生やしたsetterメソッド(xxxx=
の形のメソッド)を使ってもらうためにself.hoge_id = nil
とすること。
つまり早い話しがRubyはこういう動きをすることのようだ
ARでどうしようって悩んでいたが結局、Rubyはこういう動きをするようだ。
def piyo
self.foos.present? #=> publicなfoosゲッターへアクセス
foos.present? #=> foosローカル変数ないよ。ないならfoosゲッターへアクセス。(これはARが生やしたゲッター)
hoge_id = nil #=> hoge_idローカル変数をnil
self.hoge_id = nil #=> hoge_idセッターでnilに設定(これはARが生やしたセッター)
end
ゲッターの場合はいい感じに気を利かせた感じに動くけど、セッターの場合はローカル変数じゃん!これに代入しよってなっちゃうわけみたい。@hoge_id
と@
を使ったときはまた頭が混乱しそうなので調べる。
参考:
Why isn't self always needed in ruby / rails / activerecord? - Stack Overflow