#RailsのDirtyモジュール
##はじめに
今回はDirtyモジュールのご紹介。こやつはオブジェクトに変更が加えられたか検出できるやつ。
何に使うのかイメージ湧かないので掘り下げてみる。
#とりあえずオブジェクトの属性の変更を検出してみる。
irb(main):004:0> user =User.new
=> #<User id: nil, created_at: nil, updated_at: nil, name: nil, email: nil>
irb(main):007:0> user.changed?
=> false
irb(main):008:0> user.name = 'kamo'
=> "kamo"
irb(main):009:0> user.changed?
=> true
名前が変わった変わったね〜.....で?何に使うの?
確かに便利そうだけど使い道が初心者にはわからんのです。てな訳でググります。
→見つけた記事がこちら
なるほど...ユーザーが何か情報を更新したタイミングで発火させたいメソッドに使うのね。
before_save
で保存する前に検知してそれに伴い、何か処理をする。
##dirtyを使ってみる。
まずはinclude
する。
class User < ApplicationRecord
include ActiveModel::Dirty
end
これでメソッドが使える。
irb(main):004:0> user = User.new
=> #<User id: nil, created_at: nil, updated_at: nil, name: nil, email: nil>
irb(main):007:0> user.changed?
=> false
irb(main):008:0> user.name = 'kamo'
=> "kamo"
irb(main):009:0> user.changed?
=> true
irb(main):014:0> user.changed
=> ["name"]
irb(main):015:0> user.name_changed?
=> true
irb(main):016:0> user.email_changed?
=> false
irb(main):018:0> user.name_was
=> nil
irb(main):019:0> user.name_change
=> [nil, "kamo"]
irb(main):017:0> user.name = 'buta'
=> "buta"
irb(main):021:0> user.name_change
=> [nil, "dog"]
irb(main):022:0> user.save!
irb(main):028:0> user.name = 'cat'
=> "cat"
irb(main):029:0> user.name
irb(main):029:0> user.name_change
=> ["kamo", "cat"]
長く書きましたが、使ったメソッドは下記のみ。
changed?
そのオブジェクトが変わったか。
changes
変更の流れを配列に格納。
name_changed?
その属性変更されたか検知する。
name_was
変更前の属性。
途中で試してますが、保存されている属性との比較なので、saveしない限り変更の履歴は増えません。
さて、使い方としては履歴を残す。というのが簡単な発想かなと(先輩に聞いたンゴ)思います。
例えばこのqiitaの記事、編集履歴が残ってますよね。そのような機能もdiretyで実装できます。
意外と便利なのですじゃ
##まとめ
dirtyの実用例聞いてたら、ログを残すためとか結構必須な気がしてきたので書いてみました。
明日はキャッシュかな〜
##参考にしたの
Active Model の基礎
https://railsguides.jp/active_model_basics.html
RailsのDirtyはなぜDirtyというのか。
http://ria10.hatenablog.com/entry/20131002/1380705120