LoginSignup
1
2

More than 5 years have passed since last update.

AR内でselfを付けるかどうか

Last updated at Posted at 2017-03-22

AR内のメソッドでselfを書くべきか書かないべきか悩んでいたのでここにメモ。

  • Rubyprivateメソッドはレシーバー(hoge.methodの形)で呼び出せない
    • つまりAR内でself.methodの形で書くとprivateメソッドが呼び出せない。
    • 自クラス内ならpublicprivateも特に意識する必要はなし。なのでself.hogesself.fooなどとselfを書く必要はない

では、どいういうときに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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2