touch 関連先のタイムスタンプを更新する
使用可能な関連付け
belongs_tohas_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の場合と違いはない。