Ruby on Railsで祝日データを用意する-csvインポート
Ruby on Railsで祝日データを用意する-csvインポート

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重にデータが入ることを防ぐことができます。

  • .