現在、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は作成した日時)
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 |八戸市|
|以下省略| ― | ― |
以上で作業は終了となります。
今後も学んだものを公開していきたいと思いますので、よろしくお願いいたします。