Ruby on RailsでActiveRecordのモデルに属性を追加する時にattr_accessor
とattribute
という2つのメソッドが使えますが、この2つの違いって何?ということを簡単にまとめました。
結論
Ruby on RailsのActiveRecord::Attributes
モジュールのメソッドであるattribute
を使用してモデルに追加した属性は、
- その値が変更された時にダーティフラグが立つ、
- 定義時にキャスト型を指定する事により、モデルがインスタンス化される時に型をオーバーライドできる(第2引数)、
- デフォルト値を指定できる(第3引数)、
等の特徴を持ちます。一方で、Rubyの組み込みライブラリであるModule
クラスのメソッドattr_accessor
を使用した場合は、単純にそのモデルにアクセサを定義するのみであり、以下のコードと完全に等価となります。
# attr_accessor :name
def name
@name
end
def name=(val)
@name = val
end
Railsでsave
メソッドを使用するとダーティフラグにより何を保存すべきかを自動で判別してくれたりするので、単にそのインスタンスが存在する時に値が保持できれば良いならばattr_accessor
で十分ですが、モデルの状態に関わるような属性を追加したい場合はattribute
を上手く使うとコードがスッキリ書けるということになりそうです。