🤖

seedデータで日時を入れて作成

2022/04/07に公開

パRailsのイベント登録アプリを作成した際、初期データを自分なりに作成してみた

eventテーブルのカラム

  • owner_id(イベント作成者)
  • name(イベント名)
  • place(イベント開催場所)
  • start_at(イベント開始時間)
  • end_at(イベント終了時間)

初期データ作成の条件としては、

  • イベント開始時間は現在より未来の日時でないと一覧に表示されない
  • イベント終了時間は開始時間より未来の日時でないとバリデーションがかかる

seedデータ作成

今回はeventテーブルのデータだけ簡単に作成したかったので、db/seed.rbに記述
いろいろ便利な機能を使いたい場合はseed_fuのgemを使う方がいい

db/seed.rb

20.times do |n|
  start_start_day = Date.new(2022, 8, 15)
  start_end_day = Date.new(2022, 8, 31)
  end_start_day = Date.new(2023, 8, 15)
  end_end_day = Date.new(2023, 8, 31)
  Event.create(
    owner_id: 1,
    name: "test#{n}",
    place: "test_place#{n}",
    start_at: Random.rand(start_start_day..start_end_day),
    end_at: Random.rand(end_start_day..end_end_day),
    content: "test_content#{n}"
  )
end

(変数の命名が最悪なことは一旦置いておいて…)

start_start_day = Date.new(2022, 8, 15)
start_end_day = Date.new(2022, 8, 31)

この部分で、start_atカラムに入る日時の範囲を決める

end_start_day = Date.new(2023, 8, 15)
end_end_day = Date.new(2023, 8, 31)

同様に、この部分でend_atカラムに入る日時の範囲を指定
start_atに入る日時より先の日時が入るように指定

start_at: Random.rand(start_start_day..start_end_day)

start_start_dayで定義した2022-8-15からstart_end_dayで定義した2022-8-31の間でランダムな日時を取得

end_at: Random.rand(end_start_day..end_end_day)

こちらも同様

これで、seedデータが日時を含めて作成できた

補足

https://docs.ruby-lang.org/ja/latest/method/Random/i/rand.html

prng.rand(Time.new(2012, 1, 1) ... Time.new(2013,1,1)) # => 2012-02-25 03:11:42 +0900

Date.newではなくTime.newで定義すれば、時間まで取得できたっぽい?

Discussion