Help us understand the problem. What is going on with this article?

Rails5 CSVファイルを使用して都道府県名及び市区町村名をデータベースに保存

 現在、Ruby on Rails を使用し、自作アプリを制作している中で、都道府県及び市区町村のDBが必要となったため、試しに作成したDBの作成手順を下記のとおりまとめます。
 今回は@ultrasevenstarさんの投稿を参考とさせていただきました。
 エンジニアになることを目標に開発を進めているため、説明や手順に間違いや不足している箇所が見られると思いますので、ご指摘いただけると幸いです。
 
 作成手順
  ① CSVファイルの取得
  ② モデル・テーブルの作成
  ③ データの読み込み・保存

Ⅰ.作成するテーブルのイメージ

・(都道府県)prefecturesテーブル(created_at,updated_atカラム省略)

id    name 
1     北海道
2     青森県
3    岩手県
4     宮城県
5    秋田県
以下省略  ― 

・(市区町村)citiesテーブル(created_at,updated_atカラム省略)

id prefecture_id name
1  1   札幌市中央区
2  1   札幌市北区
3  1   札幌市東区
中略   ―    ― 
189 2   青森市
190 2   弘前市
191 2   八戸市
以下省略   ―    ― 

Ⅱ.開発環境

 AWS Cloud9
 Ruby 2.6.3
 Rails 5.1.6
 SQlite3 1.3.13

Ⅲ.使用するCSVファイルの取得

 今回は日本郵便㈱が公開しているCSVファイルを使用して、DBを作成しました。
 お好みのファイルを下記のリンクよりダウンロードしてください。
 ファイル取得先:日本郵便㈱
 私はリンク先より【読み仮名データの促音・拗音を小書きで表記しないもの】→【全国一括】のファイルを使用しています。
 私が使用したファイル

Ⅳ.CSVファイルの保存先

 AWS Cloud9上にapp/db/csvディレクトリを作成し、そこに【Ⅲ.使用するCSVファイルの取得】で取得したファイルを保存しました。

Ⅳ.(都道府県)Prefecture及び(市区町村)Cityモデル・テーブルの作成

 実際にデータを保存するためのモデルとテーブルを作成します。
 まずは次の2つのコマンドを実行し、モデルを作成しました。

$ rails g model Prefecture name:string
$ rails g model City prefecture_id:integer name:string 

 ※都道府県と連動して市区町村が自動的に抽出されるプルダウンを作成するために、prefecture_id カラムを追加しています。

 上記が終わったら、次のファイルが作成されます。(※XXXXXXXXXXXXXXは作成した日時)

XXXXXXXXXXXXXX_create_cities.rb
class CreateCities < ActiveRecord::Migration[5.1]
  def change
    create_table :cities do |t|
      t.integer :prefecture_id
      t.string :name

      t.timestamps
    end
  end
end
XXXXXXXXXXXXXX_create_prefectures.rb
class CreatePrefectures < ActiveRecord::Migration[5.1]
  def change
    create_table :prefectures do |t|
      t.string :name

      t.timestamps
    end
  end
end

 上記のファイルを作成したら、次のコマンドを実行し、続いてテーブルを作成します。

$ rails db:migrate

 これまでの手順で作成されたテーブルのイメージ

・(都道府県)prefecturesテーブル(created_at, updated_atカラム省略)

id  name
     
     
     
     
     
     

・(市区町村)citiesテーブル(created_at,updated_atカラム省略)

id prefecture_id name
        
        
        
        
        

Ⅴ.テーブルにデータを取り込む

 AWS Cloud9上のapp/db/seeds.rbに下記を入力します。

seeds.rb
# CSVファイルを使用することを明示
require 'csv'

# 使用するデータ(CSVファイルの列)を指定
CSVROW_PREFNAME = 6
CSVROW_CITYNAME = 7

# CSVファイルを読み込み、DB(テーブル)へ保存
CSV.foreach('db/csv/prefecture.CSV', encoding: "Shift_JIS:UTF-8") do |row|
  prefecture_name = row[CSVROW_PREFNAME]
  city_name = row[CSVROW_CITYNAME]
  prefecture = Prefecture.find_or_create_by(name: prefecture_name)
  City.find_or_create_by(name: city_name, prefecture_id: prefecture.id)
end

 上記の入力が終わったら、実際にデータを取り込むために、次のコマンドを実行します。

$ rails db:seed

 上記コマンド終了後のテーブルのイメージ

・(都道府県)prefecturesテーブル(created_at,updated_atカラム省略)

id    name 
1     北海道
2     青森県
3    岩手県
4     宮城県
5    秋田県
以下省略  ― 

・(市区町村)citiesテーブル(created_at,updated_atカラム省略)

id prefecture_id name
1  1   札幌市中央区
2  1   札幌市北区
3  1   札幌市東区
中略   ―    ― 
189 2   青森市
190 2   弘前市
191 2   八戸市
以下省略   ―    ― 

 以上で作業は終了となります。
 今後も学んだものを公開していきたいと思いますので、よろしくお願いいたします。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away