5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RailsのActiveModel::Dirtyによるインスタンス変数の監視

Posted at

はじめに

趣味として、RailsのReadmeやDocumentを読んでいる。そこで「へー」と思うのだけれども、すぐに忘れてしまうため記事としてしっかり研究したい。今回は、ActiveModel::Dirtyがクラスの監視の役割を持っているということを知った。

Rails

RailsのActiveRecord::Baseを継承しているモデルでは、そのインスタンス変数を監視することができる。具体的に例を見てゆく。

Dirty#changed?

Saveされるまでで、そのインスタンスの値が変わったかどうかで、trueもしくはfalseを返す。

goku = Saiya.new
goku.changed? # 作成されたばかりのものはもちろん、falseを返す。
# 実際に変更を加えてみる
goku.name = "悟空"
goku.changed? # nameが変更されたのでtrue

これまではなんの驚きもない予測どおりな仕様である。では変更を加え、saveした直後は何を返すのか。

goku.save
goku.changed? # false を返す。

レコード(DBのテーブルに入っている値)と、現在のインスタンスの値の差ということかと思われます。saveが失敗すればchanged?trueを返します。同じ値を再代入しても、falseを返します。

goku.name = "カカロット"
goku.save
# => 失敗した時
goku.changed? # true

goku = Saiya.where(name: "悟空")
goku.name = "悟空"
goku.changed? # false

これはバリデーションのロジックを組む時に便利なメソッドですね。

ちなみに、特定の一つのレコードだけが変化したかどうかを確かめるためのメソッドも、Railsの方で用意してくれてます。

goku = Goku.new
goku.name = "悟空"
goku.changed? # true
goku.name_changed? # true
goku.power_changed? #false
5
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
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?