1. kamohicokamo

    Posted

    kamohicokamo
Changes in title
+RailsのDirtyモジュール 初心者→中級者へのSTEP15/25
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,88 @@
+#RailsのDirtyモジュール
+##はじめに
+今回はDirtyモジュールのご紹介。こやつはオブジェクトに変更が加えられたか検出できるやつ。
+何に使うのかイメージ湧かないので掘り下げてみる。
+
+#とりあえずオブジェクトの属性の変更を検出してみる。
+
+```console
+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
+```
+名前が変わった変わったね〜.....で?何に使うの?
+確かに便利そうだけど使い道が初心者にはわからんのです。てな訳でググります。
+→見つけた[記事がこちら](http://ria10.hatenablog.com/entry/20131002/1380705120)
+なるほど...ユーザーが何か情報を更新したタイミングで発火させたいメソッドに使うのね。
+`before_save`で保存する前に検知してそれに伴い、何か処理をする。
+
+##dirtyを使ってみる。
+まずは`include`する。
+
+```User.rb
+class User < ApplicationRecord
+ include ActiveModel::Dirty
+end
+```
+これでメソッドが使える。
+
+```console
+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