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