開発中にseeds.ymlが作りたくて、実行コードをメモ代わりにペロッと。
seeds.ymlを作る意味
アプリケーションを作る時にどうしても固定で保持したいデータを保存するのにseeds.yamlに使ってます。
データ量が少なかったらmodelにenumで持つのもありなのですが、10~100行くらいならseeds.ymlで持つのが楽かな…って思います。
実行コード
$ cd path/to/app_root # アプリのルートに移動
$ mkdir db/seeds # seedsディレクトリを作り、そこにymlを保存しておきます
$ rails c # コンソールを立ち上げます。
Loading development environment (Rails 5.0.0.1)
Frame number: 0/10
$ pry(main)> target_model = OriginalAreaToArea
=> OriginalAreaToArea(id: integer, original_area: string, area_id: integer)
$ pry(main)> target_records = target_model.all
OriginalAreaToArea Load (0.3ms) SELECT `original_area_to_areas`.* FROM `original_area_to_areas`
=> [#<OriginalAreaToArea:0x007facf9847378 id: 1, original_area: "Akasaka/Roppongi", area_id: 4>,
#<OriginalAreaToArea:0x007facf9847198 id: 2, original_area: "Ginza/TokyoNihonbashi", area_id: 3>,
#//..
]
$ pry(main)> write_filepath = "#{Rails.root}/db/seeds/#{target_model.to_s.underscore}.yml"
=> "/path/to/app_root/db/seeds/original_area_to_area.yml"
$ pry(main)> open(write_filepath,"w") do |write_file|
$ pry(main)* write_file.puts target_records.to_yaml
$ pry(main)* end
nil
$ pry(main)> quit
# rake db:seedで初期データを登録するため、データはクリーニングしておく
rake db:migrate:reset
あとは、/db/seed.rb
に以下を追記する
Dir.glob("#{Rails.root}/db/seeds/*.yml").each do |yaml_filename|
# yamlのファイル名から、対応するモデルクラスを特定し、クラスをロードする
# 下記行が無いと、「ArgumentError: undefined class/module」が発生する。
File.basename(yaml_filename,".yml").classify.constantize
# yamlに記述されたレコードをDBに登録する。
File.open(yaml_filename) do |load_target_yaml|
records = YAML.load(load_target_yaml)
records.each do |record|
record.dup.save
end
end
end
seedデータを入れるときは、bundle exec rake db:seed
で。