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 | |
---|---|---|
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データを登録したい場合があるので、その際の手順をまとめました。