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
だけでなく、update
やsave
でも同様に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
の場合と違いはない。