touch 関連先のタイムスタンプを更新する

使用可能な関連付け

  • belongs_to
  • has_one

対となる関連に指定するオプション

なし

概要

保存時に関連先のタイムスタンプを更新する場合に指定するオプション。

以下のような定義があったとする。

class Book < ApplicationRecord
  belongs_to :author
end

この場合、以下のようにしてもAuthorのレコードはなんの影響も受けない。

Author.create
Book.create(author: Author.last) # booksテーブルへのinsert文が実行されるだけ

これを以下のようにtouch: trueを追加していた場合、Book.createのタイミングでauthors.updated_atを更新するupdate文も実行される。

class Book < ApplicationRecord
  belongs_to :author, touch: true
end

createだけでなく、updatesaveでも同様にauthors.updated_atを更新するupdate文が実行される。

TODO: destoryについて追記

更新カラムの指定

更新対象のカラムを指定することもできる。authorsテーブルにDATETIME型のbooks_updated_atカラムがあり、Bookのレコードが更新されたタイミングで、そのカラムを更新したい場合は以下のようにする。

class Book < ApplicationRecord
  belongs_to :author, touch: :books_updated_at
end

ただし、更新カラムを指定したからといってupdated_atが変更されなくなるわけではないので注意。レコードが更新されているのだからbook_updated_atと合わせてupdated_atも更新される。

has_oneの場合

belongs_toの場合と違いはない。