railsでテーブルを作成した際のマスターデータの登録方法

新しくテーブルを作った際にmasterデータを登録したい場合があるので、その際の手順をまとめました。

以下の様な状況です。

  • dbを作成の際にmasterデータを入れたい
  • リリースまでに項目が変わる可能性があるので、csvで管理したい。

まずテーブルを作成します

rails g model name_list name:string email:string
rails db:migrate

これでテーブルとモデルができたので、これにマスターデータのseedを作成します。 master用のseedファイルの作成場所を db/seeds/ 配下として、 master用のcsvを置く場所をdb/master/ 配下に自分はしました。

ここら辺はプロジェクトによって若干違うと思います。

mkdir db/seeds/
mkdir db/master/

読み込み用のcsvに以下の様なファイルを作ります。 [db/master/name_lists_master.csv]

id name e-mail
1 名前1 sample@sample.co.jp
2 山田 太郎 yamada@sample.co.jp
3 山本 次郎 yamamoto@sample.co.jp

csvを読み込み、マスターデータをロードするためのseedファイルを作成します。

[db/seeds/name_lists_master.rb]

require "csv"

## 起動コマンド rails r db/seeds/name_lists_master.rb 
puts "db/seeds/name_lists_master.rb 起動"
puts "NameListの削除処理"
NameList.delete_all
puts "csvを読み込みseedを実行"
puts "読み込みファイル db/master/name_lists_master.csv"
CSV.foreach('db/master/name_lists_master.csv', headers: true) do |row|
    NameList.create!(
        id: "#{row['id']}",
        name: "#{row['name']}",
        email: "#{row['e-mail']}"
    )
end
puts "シード完了"
puts "NameList.last の表示"
puts "#{NameList.last.inspect}"

実行してみます。

rails r db/seeds/name_lists_master.rb 

実行は以下の様にできます。

Running via Spring preloader in process 37189
NameListの削除処理
csvを読み込みseedを実行
読み込みファイル db/master/name_lists_master.csv
シード完了
NameList.last の表示
#<NameList id: 3, name: "山本 次郎", email: "yamamoto@sample.co.jp", created_at: "2022-04-03 05:49:00", updated_at: "2022-04-03 05:49:00">

余談

デプロイの際にmigrateだけ自動で実行する場合に、マスターデータが入ってないと、その間に500の原因になったりします

その状況を防ぐために、migrateでseedを実行する方法を検討しています。

今のところ自分は以下の方法で実行しています。

chengeでテーブルを作成した後にそのまま、execでseedを実行する方法ですね。

[db/migrate/20220403052106_create_name_lists.rb]

class CreateNameLists < ActiveRecord::Migration[6.0]
  def change
    create_table :name_lists do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
    exec( "rails r db/seeds/name_lists_master.rb")
  end
end

他にもmigrateを別のファイルで管理しようとしたのですが、version管理がなぜか更新されなかったので、何度もseedを実行する羽目になったので、ここら辺は今後の課題です。

まとめ

作った際にmasterデータを登録したい場合があるので、その際の手順をまとめました。

Nakano
Nakano
Back-end engineer

AWS,Rails,UE4,vue.js,hugo,その他なんでもやりたい

関連項目