Ruby on Railsで祝日データを用意する-csvインポート
システムで、土日祝日を判定するのは楽ですが、祝日を判定する方法は意外と難しいです。
一般的には、「Googleカレンダ」などのAPIを用いることで判定することができますが、APIの発行や今後のメンテナンスなどを踏まえると、問題の先延ばしのように思われてしまいます。
このような場合、祝日テーブルを作成する必要する方法が有力な選択肢となるため、今回は簡単に祝日テーブルを作成する方法をまとめてみました。
祝日データを準備して、UTF-8で保管する
確実な祝日データが欲しい場合、インターネットに書いてある情報だけですと整合性が難しいです。
しかし、内閣府はWEBサイト上に「国民の祝日」についてというサイトを公開しております。
2019年7月21日時点で同サイト上では「昭和30年(1955年)から平成32年(2020年)国民の祝日」というcsvファイルが公開されております。
このcsvファイルを用いることで、確かな祝日テーブルを作成することができます。
しかし、csvファイル「syukujitsu.csv」はsjisフォーマットで公開されているため、システムに合わせて文字コードを変更する必要があります。
nkfコマンドでUTF-8へ文字コードを変換するコマンドはこちらです。
nkf --overwrite -w syukujitsu.csv
Ruby on Railsで祝日テーブルを作成
Ruby on Rails側でまずは祝日テーブルを作成しましょう。
rails g model Holiday holiday:date title:string
これにより、以下のようなmodelが作成されます。
class Holiday < ActiveRecord
def change
create_table :holidays do |t|
t.date :holiday
t.string :title
t.timestamps
end
end
end
モデルを確認したらdb:migrateを行い、データベースへ反映します。
rails db:migrate
これで、データベース側の準備が完了です。
csvからDBへインポート
作成したHolidayテーブルへcsvの内容の反映を行います。
テーブルへcsvのインポートを行うために「seeds.rb」へ以下の内容を追加します。
require "csv"
# Holidayテーブルを初期化
Holiday.delete_all
# csvファイルを1行ずつ読み込む
CSV.foreach('db/syukujitsu.csv') do |row|
Holiday.create(:holiday:date => row[0], :title => row[1])
「seeds.rb」を書き終えたらcsvファイルの準備です。
「seeds.rb」では1行目からループが作成しているので「syukujitsu.csv」の1行目のタイトル行を削除します。
その後、「db」フォルダへ 「syukujitsu.csv」を格納してください。
ここまで完了したら「seed」の設定内容でcsvのインポートを行います。
rake db:seed
ここまで完了すると、Holidayテーブルに祝日データが格納されているはずです。
内閣府がcsvファイルを更新した場合も、「Holiday.delete_all」ですべて削除してから新しいcsvを取り込むため2重にデータが入ることを防ぐことができます。