Help us understand the problem. What is going on with this article?

RailsのDirtyモジュール 初心者→中級者へのSTEP15/25

More than 1 year has passed since last update.

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する。

User.rb
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

kamohicokamo
未熟なバックエンドエンジニア。かもが好き。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away