Railsで鉄道会社・路線・駅のCSVファイルからデータを挿入する方法を紹介します。
目次
駅データ.jpで鉄道会社・路線・駅データをダウンロードし、Railsプロジェクトに格納
駅データ.jpで鉄道会社・路線・駅データをダウンロードします。ダウンロードするためには会員登録が必要です。
ダウンロードしたCSVファイルをdb/data配下に格納しておきます。
- db/data/companies.csv (鉄道会社データ)
- db/data/lines.csv (路線データ)
- db/data/stations.csv (駅データ)
駅関連データ提供元:駅データ 無料ダウンロード 『駅データ.jp』
鉄道会社・路線・駅のマイグレーション作成
まずは、鉄道会社・路線・駅のマイグレーションファイルを作成します。
・db/migrate/20200101000001_create_companies.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class CreateCompanies < ActiveRecord::Migration[5.2] def change create_table :companies, id: false, options: 'ENGINE=InnoDB COLLATE=utf8_general_ci' do |t| t.integer :company_id, null: false, unique: true t.string :name t.string :kana t.string :formal_name t.string :abbreviation_name t.datetime :created_at t.datetime :updated_at t.datetime :deleted_at end end end |
・db/migrate/20200101000002_create_lines.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class CreateLines < ActiveRecord::Migration[5.2] def change create_table :lines, id: false, options: 'ENGINE=InnoDB COLLATE=utf8_general_ci' do |t| t.integer :line_id, null: false, unique: true t.integer :company_id t.string :name t.string :kana t.decimal :lat, :precision => 9, :scale => 6, null: true t.decimal :lng, :precision => 9, :scale => 6, null: true t.datetime :created_at t.datetime :updated_at t.datetime :deleted_at end end end |
・db/migrate/20200101000003_create_stations.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class CreateStations < ActiveRecord::Migration[5.2] def change create_table :stations, id: false, options: 'ENGINE=InnoDB COLLATE=utf8_general_ci' do |t| t.integer :station_id, null: false, unique: true t.integer :line_id t.string :name t.string :address t.decimal :lat, :precision => 9, :scale => 6, null: true t.decimal :lng, :precision => 9, :scale => 6, null: true t.datetime :created_at t.datetime :updated_at t.datetime :deleted_at end end end |
鉄道会社・路線・駅のモデル作成
鉄道会社・路線・駅のモデル作成を作成します。各々のリレーションもはっておきます。
・app/models/company.rb
1 2 3 4 5 6 7 8 | class Company < ApplicationRecord ## # リレーション ## has_many :lines end |
・app/models/line.rb
1 2 3 4 5 6 7 8 9 | class Line < ApplicationRecord ## # リレーション ## belongs_to :company has_many :stations end |
・app/models/station.rb
1 2 3 4 5 6 7 8 | class Station < ApplicationRecord ## # リレーション ## belongs_to :line end |
seed.rbで鉄道会社・路線・駅データを取得し、テーブルに保存
先ほど保存したCSVファイルから必要なカラムのデータを取得していきます。鉄道会社データから駅データを取得していき、完了です。
・db/seeds.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | require 'csv' # 鉄道会社CSVファイルパス COMPANY_PATH = "db/data/companies.csv" # 鉄道会社カラム指定定数 COMPANY_CSVROW_COMPANY_ID = 0 COMPANY_CSVROW_NAME = 2 COMPANY_CSVROW_KANA = 3 COMPANY_CSVROW_FORMAL_NAME = 4 COMPANY_CSVROW_ABBREVIATION_NAME = 5 # 鉄道会社CSVを読み込みテーブルに保存 CSV.foreach(COMPANY_PATH) do |row| company_id = row[COMPANY_CSVROW_COMPANY_ID] name = row[COMPANY_CSVROW_NAME] kana = row[COMPANY_CSVROW_KANA] formal_name = row[COMPANY_CSVROW_FORMAL_NAME] abbreviation_name = row[COMPANY_CSVROW_ABBREVIATION_NAME] Company.find_or_create_by( :company_id => company_id, :name => name, :kana => kana, :formal_name => formal_name, :abbreviation_name => abbreviation_name ) end # 路線CSVファイルパス LINE_PATH = "db/data/lines.csv" # 路線カラム指定定数 LINE_CSVROW_LINE_ID = 0 LINE_CSVROW_COMPANY_ID = 1 LINE_CSVROW_NAME = 2 LINE_CSVROW_KANA = 3 LINE_CSVROW_LNG = 8 LINE_CSVROW_LAT = 9 # 路線CSVを読み込みテーブルに保存 CSV.foreach(LINE_PATH) do |row| line_id = row[LINE_CSVROW_LINE_ID] company_id = row[LINE_CSVROW_COMPANY_ID] name = row[LINE_CSVROW_NAME] kana = row[LINE_CSVROW_KANA] lng = row[LINE_CSVROW_LNG] lat = row[LINE_CSVROW_LAT] Line.find_or_create_by( :line_id => line_id, :company_id => company_id, :name => name, :kana => kana, :lat => lat, :lng => lng ) end # 駅CSVファイルパス STATION_PATH = "db/data/stations.csv" # 駅カラム指定定数 STATION_CSVROW_STATION_ID = 0 STATION_CSVROW_NAME = 2 STATION_CSVROW_LINE_ID = 5 STATION_CSVROW_ADDRESS = 8 STATION_CSVROW_LNG = 9 STATION_CSVROW_LAT = 10 # 駅CSVを読み込みテーブルに保存 CSV.foreach(STATION_PATH) do |row| station_id = row[STATION_CSVROW_STATION_ID] name = row[STATION_CSVROW_NAME] line_id = row[STATION_CSVROW_LINE_ID] address = row[STATION_CSVROW_ADDRESS] lng = row[STATION_CSVROW_LNG] lat = row[STATION_CSVROW_LAT] Station.find_or_create_by( :station_id => station_id, :line_id => line_id, :name => name, :address => address, :lat => lat, :lng => lng ) end |
以上、鉄道会社・路線・駅データをseedで取得・インポートする方法でした。