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した時点の時刻が入っています。