Railsでcsvファイルから初期データを投入する
Railsを勉強中です。
csvファイルから初期データをDBに投入し、画面に表示するという一連の処理をメモします。
railsのバージョンは4.2.6です。
サンプルのアプリケーションを新しく作ります。
$ rails new exm-csv-import
このようなデータを投入します。
モデルを生成します。
$ rails g model PostalCode local_goverment_code:integer postal_code_old:integer postal_code:integer prefecture_katakana:string ward_katakana:string town_katakana:string prefecture:string ward:string town:string
dbフォルダの下にcsvファイルをコピーします。
db/seeds.rbを次のように編集します。
ここでは、csvファイルにカラム名を記述したヘッダー有りの場合と無しの場合次のようになります。
ヘッダー有りのcsv
ヘッダー有り
require 'csv' csv_data = CSV.read('db/postal_code_tokyo_with_header.csv', headers: true) csv_data.each do |data| PostalCode.create!(data.to_hash) end
ヘッダー無し
require 'csv' CSV.foreach('db/postal_code_tokyo_seed_no_header.csv') do |row| PostalCode.create(:local_goverment_code => row[0], :postal_code_old => row[1], :postal_code => row[2], :prefecture_katakana => row[3], :ward_katakana => row[4], :town_katakana => row[5], :prefecture => row[6], :ward => row[7], :town => row[8]) end
db:migrateをまだ行ってないので実行してから、rake db:seedを実行します。
$ rake db:migrate $ rake db:seed
これでcsvファイルからテーブルにデータが投入されました。
確認します。
sqliteのコマンドを起動し開発用Databaseに入ります。
sqlite3 db/development.sqlite3
ちなみに sqlite> .tables とするとテーブル一覧が表示されます。 postal_codes schema_migrations sqlite> .schema postal_codes; とするとスキーマが表示されます。 CREATE TABLE "postal_codes" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "local_goverment_code" integer, "postal_code_old" integer, "postal_code" integer, "prefecture_katakana" varchar, "ward_katakana" varchar, "town_katakana" varchar, "prefecture" varchar, "ward" varchar, "town" varchar, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);
sqlite> select * from postal_codes
でテーブルの中身が表示されます。うまくできました。
このテーブルの一覧を画面に表示します。
コントローラを作成します。
$ rails g controller postal_codes
postal_codes_controller.rb に以下を追加します。
class PostalCodesController < ApplicationController # GET /postal_codes def index @postal_codes = PostalCode.all end end
/app/views/postal_codes/ に index.html.erb を追加し、次のように記述します。
<h1>Listing Postal Codes</h1> <table> <thead> <tr> <th>LocalGovermentCode</th> <th>PostalCodeOld</th> <th>PostalCode</th> <th>PrefectureKatakana</th> <th>WardKatakana</th> <th>TownKatakana</th> <th>Prefecture</th> <th>Ward</th> <th>Town</th> </tr> </thead> <tbody> <% @postal_codes.each do |postal_code| %> <tr> <td><%= postal_code.local_goverment_code %></td> <td><%= postal_code.postal_code_old %></td> <td><%= postal_code.postal_code %></td> <td><%= postal_code.prefecture_katakana %></td> <td><%= postal_code.ward_katakana %></td> <td><%= postal_code.town_katakana %></td> <td><%= postal_code.prefecture %></td> <td><%= postal_code.ward %></td> <td><%= postal_code.town %></td> </tr> <% end %> </tbody> </table>
/config/routes.rb に以下を追加します。
Rails.application.routes.draw do resources :postal_codes (略)
rails s でローカルサーバーを起動します。
http://localhost:3000/postal_codes
にアクセスします。
このように表示されます。
以上です。