RailsというかActiveSupportのTimeHelpersにはtravel_toみたいな、現在時刻を偽装?するメソッドがあります。主にテストで使うもので、例えば1ヶ月後に何かが無効になるのをテストするときなんかに使われたりします。
そのtravel_toを開発用に使ってみました。
週次で集計するような時系列データのグラフを表示するような機能を作るにあたり、開発環境だとまともにデータがないためにグラフをまともに作れなかったためです。
rails runnerで起動するスクリプトとして以下のように書きました。
1exit unless Rails.env.development?
2
3require 'active_support/testing/time_helpers'
4include ActiveSupport::Testing::TimeHelpers
5
6ApplicationRecord.transaction do
7 initial = Time.zone.local(2018, 9, 1, 12, 0)
8
9 (1..52).each do |i|
10 time = initial + i.week
11 puts "generating data for #{time}"
12
13 # ここで時刻を移動
14 travel_to time do
15 MyModel.generate_data!
16 end
17 end
18end
まず、本番などで動かないように環境をdevelopment?にのみ限定します。続いて必要なファイルのrequireやincludeなどをします。
あとは適当にループを回しながら、1週間後、2週間後、、と時刻をずらしていき、その時点で生成したデータものとしてデータがDBに登録されていきます。
これにより1年後までのデータを作れました。
created_atなどのカラムにも、ちゃんとtravel_toした時点の時刻が入っています。