RailsというかActiveSupportのTimeHelpersにはtravel_toみたいな、現在時刻を偽装?するメソッドがあります。主にテストで使うもので、例えば1ヶ月後に何かが無効になるのをテストするときなんかに使われたりします。

そのtravel_toを開発用に使ってみました。

週次で集計するような時系列データのグラフを表示するような機能を作るにあたり、開発環境だとまともにデータがないためにグラフをまともに作れなかったためです。

rails runnerで起動するスクリプトとして以下のように書きました。

exit unless Rails.env.development?

require 'active_support/testing/time_helpers'
include ActiveSupport::Testing::TimeHelpers

ApplicationRecord.transaction do
  initial = Time.zone.local(2018, 9, 1, 12, 0)

  (1..52).each do |i|
    time = initial + i.week
    puts "generating data for #{time}"

    # ここで時刻を移動
    travel_to time do
      MyModel.generate_data!
    end
  end
end

まず、本番などで動かないように環境をdevelopment?にのみ限定します。続いて必要なファイルのrequireやincludeなどをします。

あとは適当にループを回しながら、1週間後、2週間後、、と時刻をずらしていき、その時点で生成したデータものとしてデータがDBに登録されていきます。

これにより1年後までのデータを作れました。

created_atなどのカラムにも、ちゃんとtravel_toした時点の時刻が入っています。