久保清隆のブログ

ライフハック、健康、旅行など、役立つ情報を書きます。

【Rails】新しく追加するupdated_atにレコード毎に異なる初期値を入れる方法

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)

改訂3版基礎 Ruby on Rails (KS IMPRESS KISO SERIES)



お読み頂きありがとうございます。
少しでもお役に立てたらクリックお願いします↓。
にほんブログ村 IT技術ブログ プログラム・プログラマへ人気ブログランキングへ Subscribe with livedoor Reader