🙌

[Rails]開発・本番環境それぞれに違うSeedデータ投入方法

2023/04/25に公開

以前このように、fackerでのダミーデータ挿入について行いました。

https://zenn.dev/airiswim/articles/472b2f88df40e9

前回はfackerでダミーデータを挿入する方法について説明した。
今回は、本番環境に入れたくないけれども、adminのデータだけは本番環境にseedで入れたい場合
について説明します。

前回までの作成faker file
  • db/seeds/user.rb
Faker::Config.locale = :ja

#markdown faker: https://github.com/faker-ruby/faker/blob/main/doc/default/markdown.md
10.times do
  user = User.create(
    first_name: Faker::Name.first_name,
    last_name: Faker::Name.last_name,
    first_name_kana: Faker::Name.first_name,
    last_name_kana: Faker::Name.last_name,
    email: Faker::Internet.email,
    password: "12345678",
  )
  15.times do
    title = Faker::Lorem.sentence(word_count: 3)

    # body = Faker::Lorem.paragraph(sentence_count: 3)
    markdowns = []

    10.times do
      markdown = Faker::Markdown.random(
        "headers",
        "emphasis",
        "ordered_list",
        "unordered_list",
        "block_code"
      ) + "\n"
      markdowns << markdown
    end

    body = markdowns.join("\n")

    @post = Post.create(
      title: title,
      body: body,
      user_id: user.id,
      post_status: 0,
    )

    tags = []
    3.times do
      tags << "#" + Faker::Lorem.word
    end

    # 重複を削除する
    sent_tags = tags.join(" ").scan(/#\w+/).map(&:strip).uniq.map(&:downcase)

    # 既存のハッシュタグを取得する
    existing_tags = Hashtag.where(hashtag_name: sent_tags)

    existing_tags.each do |tag|
      post_hashtag = PostHashtag.where(hashtag_id: tag.id, post_id: @post.id)
      PostHashtag.create(hashtag_id: tag.id, post_id: @post.id)
    end

    # 既存のハッシュタグと重複していないタグを追加する
    new_tags = sent_tags - existing_tags.pluck(:hashtag_name)
    new_tags.each do |tag_name|
      tag = Hashtag.create(hashtag_name: tag_name)
      PostHashtag.create(hashtag_id: tag.id, post_id: @post.id)
    end
  end

  15.times do
    Event.create(
      event_name: Faker::Lorem.sentence(word_count: 3),
      event_introduction: Faker::Lorem.paragraph(sentence_count: 3),
      date: Faker::Time.between(from: 3.months.ago, to: DateTime.now + 3.months),
      url: Faker::Internet.url,
      creator_id: user.id,
      event_type: Faker::Number.within(range: 0..1),
      address: "Tokyo, Shinjuku City, Shinjuku, 3 Chome−38, 新宿駅",
      latitude: 35.68987680887586,
      longitude: 139.70061421319159,
    )
  end
end

  • db/seed.rb
#admin情報
Admin.create!(
  email: "admin@gmail.com",
  password: "admin123",
)

require_relative "seeds/users"

前提条件

前提条件として、現在は開発環境と本番環境でseedsディレクトリが分かれていないため、まずは環境別のseedsフォルダを作成して その中にファイルを作成する必要があります。

そして本番と開発で分けていきます!

db/seeds/development.rb
db/seeds/production.rb
db/seeds.rb

2. 環境別にseed ファイルを作成

今回は今までのfaker使用したものはdevelopmentのみ。
adminの情報のみをproductionに反映させていきます。

  • development.rb: 既存のuser.rbファイルの内容を移行します。
  • production.rb: admin情報を追加します。

#production.rb

#admin情報
Admin.create!(
  email: "admin@gmail.com",
  password: "admin123",
)

3. seeds.rb に読み込み処理を追加

seeds.rb に、環境に応じた seeds ファイルを読み込む処理を追加していく。
以下のように Rails.env で現在の環境を取得し、その環境に応じた seeds ファイルを読み込みます。

load(Rails.root.join("db", "seeds", "#{Rails.env.downcase}.rb"))
# load(Rails.root.join("親ディレクトリ", "子ディレクトリ", "#{開発環境名.downcase}.rb))
  • 本番環境でのdb:drop
    RAILS_ENV=production rake db:drop DISABLE_DATABASE_ENVIRONMENT_CHECK=1

  • seed
    rails db:seed RAILS_ENV=production


完了!

Discussion