1. ホーム
  2. ruby-on-rails

[解決済み] モデルから属性の変更を検出するには?

2023-03-17 20:53:08

質問

モデルが保存された後に実行されるコールバック関数をrailsで作成したいです。

Claimというモデルがあって、そのClaimの状態に応じて変化する'status'という属性を持っているのですが、考えられる値はpending, endorsed, approved, rejectedです。

データベースには、デフォルト値として'pending'を持つ'state'があります。

モデルが初めて作成された後や、ある状態から別の状態に更新された後に、どの状態から変化したかによって、特定のタスクを実行したいと思います。

私の考えは、モデル内に関数を用意することです。

    after_save :check_state

    def check_state
      # if status changed from nil to pending (created)
      do this

      # if status changed from pending to approved
      performthistask
     end

質問ですが、モデル内で変更前の値を確認するにはどうすればいいのでしょうか?

どのように解決するのですか?

以下のサイトを参照してください。 ActiveModel::Dirty モジュールを見てください。 Claimモデルに対して以下のアクションを実行できるようになるはずです。

claim.status_changed?  # returns true if 'status' attribute has changed
claim.status_was       # returns the previous value of 'status' attribute
claim.status_change    # => ['old value', 'new value'] returns the old and 
                       # new value for 'status' attribute

claim.name = 'Bob'
claim.changed # => ["name"]
claim.changes # => {"name" => ["Bill", "Bob"]}

ああ、Railsの喜びよ!