Railsで、テーブルにupdated_atを追加しようと思って、さらに初期値に他のテーブルの関連づいたレコードの更新日時を代入したかった。
そのための方法をまとめておく。
まず、マイグレーションファイルを作成する。
Tagテーブルにupdated_atカラムを追加する。
timestampは、saveされたとき、自動的にその日時を保存してくれる。
def self.up add_column :tags, :updated_at, :timestamp, :null => false ActiveRecord::Base.record_timestamps = false Tag.find(:all).each do |tag| tag.updated_at = tag.taggings.last.created_at unless tag.taggings.blank? tag.save end ActiveRecord::Base.record_timestamps = true end
流れとしては、
- updated_atカラムを追加する
- updated_atに自動的に更新日時が記録されないようにする
(ここで、記録されないようにしておかないと、初期値を代入して保存した時に保存日時がupdated_atに入ってしまい、初期値が上書きされてしまう。)
- 各レコードに対応した初期値を代入する
- レコードを保存する
- 自動的に更新日時が記録される状態に戻す
このファイルをrake db:migrateすれば完了。
改訂3版基礎 Ruby on Rails (KS IMPRESS KISO SERIES)
- 作者: 黒田努,佐藤和人,株式会社オイアクス
- 出版社/メーカー: インプレス
- 発売日: 2015/05/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
お読み頂きありがとうございます。
少しでもお役に立てたらクリックお願いします↓。